Java 8中的Stream

602 阅读2分钟

这是我参与8月更文挑战的第25天,活动详情查看:8月更文挑战

Stream(Java8)

java 8新特性 使用stream流,流在管道中传输, 并且可以在管道的节点上进行处理, 比如筛选, 排序,聚合等。元素流在管道中经过中间操作的处理,最后由最终操作得到前面处理的结果 其实这个图很形象

image.png

Stream(流)是一个来自数据源的元素队列并支持聚合操作:其中数据源就是流的来源,这个源可以是集合,数组等,而进行的集合操作可以是filter, map, reduce, find, match, sorted等 我们可以通过代码来看流式操作:

  • filter

    其实就是一个过滤操作,自己设置过滤条件进行过滤

//1.字符串
List<String> strings = Arrays.asList("a", "", "bb", "ccc", "dddd","", "efg");
//2.空字符串的数量
count = strings.stream().filter(string->string.isEmpty()).count(); 
System.out.println("空字符串数量为: " + count);

数据源是strings.stream();进行的聚合操作filter,过滤后的流是:字符换为空的流 最终操作是计算流的个数 最终运行的结果是:空字符串数量为: 2 可以再看几个filter操作:

count = strings.stream().filter(string -> string.length() == 3).count();
System.out.println("字符串长度为 3 的数量为: " + count);
filtered = strings.stream().filter(string ->!string.isEmpty()).collect(Collectors.toList());
System.out.println("筛选后的列表: " + filtered);
mergedString = strings.stream().filter(string ->!string.isEmpty()).collect(Collectors.joining(", "));
System.out.println("合并字符串: " + mergedString);

image.png

  • map

map 方法用于映射每个元素到对应的结果

List<Integer> numbers = Arrays.asList(3, 2, 2, 3, 7, 3, 5);
squaresList1 = numbers.stream().map( i ->i*i).collect(Collectors.toList());
squaresList2 = numbers.stream().map( i ->i*i).distinct().collect(Collectors.toList());
System.out.println("Squares1 List: " + squaresList1);
System.out.println("Squares2 List: " + squaresList2);

squaresList1是直接计算每个数组的值平方 并对应到相应位置,而squaresList2则也是一一对应 但是去重了 但相对的位置也没有变化 输出的结果:

Squares1 List: [9, 4, 4, 9, 49, 9, 25]

Squares2 List: [9, 4, 49, 25]

  • mapToInt 返回一个IntStream由将给定函数应用于此流的元素的结果组成。
List<Integer> integers = Arrays.asList(1,2,13,4,15,6,17,8,19);
IntSummaryStatistics stats = integers.stream().mapToInt((x) ->x).summaryStatistics();
System.out.println("列表中最大的数 : " + stats.getMax());
System.out.println("列表中最小的数 : " + stats.getMin());
System.out.println("所有数之和 : " + stats.getSum());
System.out.println("平均数 : " + stats.getAverage());

返回IntSummaryStatistics描述有关此流元素的各种摘要数据。 image.png image.png

除了有mapToInt,还有mapToDouble,mapToLong类似

  • limit limit 方法用于获取指定数量的流
//限制输出2个随机数
Random random = new Random();
random.ints().limit(5).sorted().forEach(System.out::println);

其中IntStream  ints()返回有效无限的伪随机int 值流(好像它是调用方法nextInt()的结果一样) sorted 方法用于对流进行排序 forEach:Stream 提供了新的方法 'forEach' 来迭代流中的每个数据

总结

使用stream 可以极大的提高我们开发过程中的效率 代码看着干净简洁。今天主要分享的是在开发中我会用到的一些stream流 而更多的内容可以去参考API文档:docs.oracle.com/javase/8/do…