Java8新特性: Stream中常用API

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官方文档: 地址

上一篇:玩转Java8的 Stream 之从零认识Stream


下一篇:java8新特性