Stream流是用来操作集合或者数组中的数据的,Stream流提供了一种更加强大的,更加简单的方式来操作集合或者数组中的数据,代码更加简洁,可读性更好。下面是一个简单的例子:
public class S1 {
public static void main(String[] args) {
List<String> names = new ArrayList<>();
Collections.addAll(names, "张三丰", "张无忌", "周芷若", "赵敏", "张强");
System.out.println(names);
// 找出姓张的,且名字是三个字的存入到新集合中去
System.out.println(getZ3(names));
// 使用Stream流实现上述需求
List<String> list = names.stream()
.filter(s -> s.startsWith("张"))
.filter(s -> s.length()==3)
.collect(Collectors.toList());
System.out.println(list);
}
static List<String> getZ3(List<String> names){
List<String> newNames = new ArrayList<>();
// 遍历集合,然后匹配姓张且为三个字的将其添加到新的集合中去
for (String name : names) {
if (name.length()==3 && name.startsWith("张")){
newNames.add(name);
}
}
return newNames;
}
}
关于Stream流操作数据的描述:Stream流就像是一条流水线,能够跟数据建立连接,然后调用流水线上的各种方法对数据进行处理、计算等,最后获取处理的结果,遍历、统计、收集到一个新集合中返回。
Stream流常见的中间方法:
运用不同中间方法的例子:
// 需求1:对包含分数的集合,找出大于60的,并进行升序排序后输出
List<Double> list1 = new ArrayList<>();
Collections.addAll(list1, 59.0, 80.0, 80.1, 85.2, 79.0, 60.0, 90.0, 86.9);
list1.stream().filter(s -> s >= 60).sorted().forEach(s -> System.out.println(s));
// 需求2:找出年龄大于等于23,且年龄小于等于30岁的学生,并按照年龄降序输出
List<Student> students = new ArrayList<>();
Student s1 = new Student("张三", 31, 172.1);
Student s2 = new Student("李四", 27, 180.2);
Student s3 = new Student("王五", 23, 179.0);
Student s4 = new Student("赵六", 30, 171.0);
Student s5 = new Student("赵六", 33, 178.0);
Collections.addAll(students, s1, s2, s3, s4, s5);
students.stream().filter(student -> student.age>=23 && student.age<=30).sorted(((o1, o2) -> o2.age - o1.age))
.forEach(student -> System.out.println(student));
// 需求3:找出身高前三名的学生输出
students.stream().sorted(((o1, o2) -> Double.compare(o2.height, o1.height))).limit(3)
.forEach(student -> System.out.println(student));
// 需求4:取出身高最矮的两位同学的信息
System.out.println("最矮的两位同学:");
students.stream().sorted((o1, o2) -> Double.compare(o1.height, o2.height)).limit(2)
.forEach(student -> System.out.println(student));
// 需求5:找出身高超过168的学生的名字,要求去除重复的名字,再输出
students.stream().filter(student -> student.height>168).map(student -> student.name).distinct()
.forEach(s -> System.out.println(s));
Stream流常见的终结方法:终结方法是指这些方法调用之后就不会继续返回Stream流了
运用stream流终结方法的例子
List<Student> students = new ArrayList<>();
Student s1 = new Student("张三", 31, 162.1);
Student s2 = new Student("李四", 27, 180.2);
Student s3 = new Student("王五", 23, 179.0);
Student s4 = new Student("赵六", 30, 171.0);
Collections.addAll(students, s1, s2, s3, s4);
// 需求1:计算出身高超过168的学生一共有几人
long count = students.stream().filter(student -> student.height > 168).count();
System.out.println(count);
// 需求2:找出身高最高的学生对象
Student s = students.stream().max(((o1, o2) -> Double.compare(o1.height, o2.height))).get();
System.out.println(s);
// 需求3:找出身高最矮的学生对象
Student ss = students.stream().min(((o1, o2) -> Double.compare(o1.height, o2.height))).get();
System.out.println(ss);
// 需求4:找出身高超过170的学生对象,并放到一个新集合中去返回
List<Student> students1 = students.stream().filter(student -> student.height > 170).collect(Collectors.toList());
System.out.println(students1);
// 需求5:找出身高超过170的学生对象,并将其名字和身高放入到一个Map集合中返回
Map<String, Double> stringDoubleMap = students.stream().filter(student -> student.height > 170).collect(Collectors.toMap(a -> a.name, a -> a.height));
System.out.println(stringDoubleMap);
// 将学生对象收集到数组中去
Student[] students2 = students.stream().toArray(len -> new Student[len]);
System.out.println(Arrays.toString(students2));