Java 8 API添加了一个新的抽象称为流Stream,可以让你以一种声明的方式处理数据。
Stream(流)
Stream 使用一种类似用 SQL 语句从数据库查询数据的直观方式来提供一种对 Java 集合运算和表达的高阶抽象。
Stream API可以极大提高Java程序员的生产力,让程序员写出高效率、干净、简洁的代码。
这种风格将要处理的元素集合看作一种流, 流在管道中传输, 并且可以在管道的节点上进行处理, 比如筛选, 排序,聚合等。
生成流
在 Java 8 中, 集合接口有两个方法来生成流:
- stream() − 为集合创建串行流。
- parallelStream() − 为集合创建并行流。
List<Integer> integerList = Arrays.asList(22, 36, 50, 62, 18);
List<Integer> notNullList = integerList.stream().filter(Objects::nonNull).collect(Collectors.toList());
forEach
Stream 提供了新的方法 ‘forEach’ 来迭代流中的每个数据
List<Integer> integerList = Arrays.asList(22, 36, 50, 62, 18);
integerList.forEach(System.out::println);
collect(收集)
collect,收集,可以说是内容最繁多、功能最丰富的部分了。从字面上去理解,就是把一个流收集起来,最终可以是收集成一个值也可以收集成一个新的集合。
过滤/拼接(filter/joining)
List<Teacher> teacherList = new ArrayList<>();
teacherList.add(new Teacher("张磊",22,"zl"));
teacherList.add(new Teacher("*",36,"lp"));
teacherList.add(new Teacher("刘敏",50,"lm"));
teacherList.add(new Teacher("宋亚楠",62,"syn"));
teacherList.add(new Teacher("彩彬",18,"cb"));
//filter 过滤
List<Teacher> list = teacherList.stream().filter(x -> x.getAge() > 30).collect(Collectors.toList());
//joining拼接 所有老师姓名拼接成字符串
String nameJoin = teacherList.stream().map(Teacher::getName).collect(Collectors.joining(","));
System.out.println(nameJoin);
System.out.println(list);
输出结果
[Teacher(name=*, age=36, nikeName=lp), Teacher(name=刘敏, age=50, nikeName=lm), Teacher(name=宋亚楠, age=62, nikeName=syn)]
张磊,*,刘敏,宋亚楠,彩彬
聚合(count/max)
统计集合中元素个数和最大值
//max最大值 获取年龄最大的老师
Optional<Teacher> teacherOptional = teacherList.stream().max(Comparator.comparing(Teacher::getAge));
System.out.println(teacherOptional);
//count(统计) 统计年龄大于30岁的老师人数
long count = teacherList.stream().filter(o -> o.getAge() > 30).count();
System.out.println(count);
输出结果
Optional[Teacher(name=宋亚楠, age=62, nikeName=syn)]
3
提取(limit/skip/distinct)
Stream还可以对集合中元素选着性提取和去重
List<String> stringList = Arrays.asList("A", "B", "C", "D", "E", "E", "F");
//limit 前n个
List<String> limitList = stringList.stream().limit(2).collect(Collectors.toList());
System.out.println("limit: "+limitList);
//skip 跳过前n个
List<String> skipList = stringList.stream().skip(2).collect(Collectors.toList());
System.out.println("skip: "+skipList);
//distinct 去重
List<String> distinctList = stringList.stream().distinct().collect(Collectors.toList());
System.out.println("distinct: "+distinctList);
输出结果
limit: [A, B]
skip: [C, D, E, E, F]
distinct: [A, B, C, D, E, F]
统计(count/max/sum)
计算集合中元素的个数,最大值,求和
List<Integer> integerList = Arrays.asList(22, 36, 50, 62, 18);
//count 统计
long count = integerList.stream().filter(i -> i>20).count();
System.out.println("统计: "+count);
//averagingDouble 平均值
Double averAge = integerList.stream().collect(Collectors.averagingDouble(Integer::intValue));
System.out.println("平均值: "+averAge);
//sum 求和
int sum = integerList.stream().mapToInt(Integer::intValue).sum();
System.out.println("求和: " + sum);
//summarizingDouble 统计所有信息
DoubleSummaryStatistics doubleSummaryStatistics = integerList.stream().collect(Collectors.summarizingDouble(Integer::intValue));
System.out.println("统计所有信息: "+doubleSummaryStatistics);
输出结果
统计: 4
平均值: 37.6
求和: 188
统计所有信息: DoubleSummaryStatistics{count=5, sum=188.000000, min=18.000000, average=37.600000, max=62.000000}
Stream官方文档: 地址