java8新特性之Stream

  • Post author:
  • Post category:java


一、Stream是什么?

Java8中的Stream是对容器对象功能的增强,它专注于对容器对象进行各种非常便利、高效的 聚合操作(aggregate operation),或者大批量数据操作 (bulk data operation)。Stream不是集合元素,它不是数据结构并不保存数据,它是有关算法和计算的,它更像一个高级版本的Iterator。原始版本的Iterator,用户只能显式地一个一个遍历元素并对其执行某些操作;高级版本的Stream,用户只要给出需要对其包含的元素执行什么操作,比如,“过滤掉长度大于 10 的字符串”、“获取每个字符串的首字母”等,Stream会隐式地在内部进行遍历,做出相应的数据转换。

二、Stream的构成

当我们使用一个流的时候,通常包括三个基本步骤:获取一个数据源(source)→ 数据转换 → 执行操作获取想要的结果。每次转换原有Stream对象不改变,返回一个新的Stream对象(可以有多次转换),这就允许对其操作可以像链条一样排列,变成一个管道。

三、Stream的创建

在 Java 8 中, 集合接口有两个方法来生成流:

stream() − 为集合创建串行流(由主线程按顺序对流执行操作)

parallelStream() − 为集合创建并行流(内部以多线程并行执行的方式对流进行操作,但前提是流中的数据处理没有顺序要求)

Stream可以通过集合数组创建。

1、通过 java.util.

Collection

.stream() 方法用集合创建流

// 创建一个list

List<String> list = Arrays.asList(“a”, “b”, “c”);

// 创建一个顺序流

Stream<String> stream = list.stream();

// 创建一个并行流

Stream<String> parallelStream = list.parallelStream();

除了直接创建并行流,还可以通过 parallel()把顺序流转换成并行流:

Optional<Integer> findFirst = list.stream().parallel().filter(x->x>6).findFirst();

2、使用 java.util.Arrays.stream(T[]array)方法用数组创建流

int[] array={1,3,5,6,8};

IntStream stream = Arrays.stream(array);

四、Stream的方法使用

1、使用 Stream的静态方法:of()、iterate()、generate()、limit

// 输出包含1、2、3的

IntStream.of(new int[]{1, 2, 3}).forEach(System.out::println);

// 范围过滤,输出1,2

IntStream.range(1, 3).forEach(System.out::println);

// 范围过滤,输出1,2,3

IntStream.rangeClosed(1, 3).forEach(System.out::println);

// iterate循环迭代,进行加3计算,限制4条。limit用于限制条数

Stream<Integer> stream2 = Stream.iterate(0, (x) -> x + 3).limit(4);

stream2.forEach(System.out::println);

// 用于生成一个无限连续的无序流,流中的元素由用户定义的supplier函数生成,限制3条。如果不限制会一直。。。

Stream<Double> stream3 = Stream.generate(Math::random).limit(3);

stream3.forEach(System.out::println);

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

List<Integer> numbers = Arrays.asList(3, 2, 2, 3, 7, 3, 5);

// 获取对应的平方数

List<Integer> squaresList = numbers.stream().map( i -> i*i).distinct().collect(Collectors.toList());

squaresList.forEach(System.out::println);

3、filter方法用于通过设置的条件过滤出元素。

List<String> strings = Arrays.asList(“1”, “2”, “3”, “”, “5”,””, “6”);

// 获取空字符串的数量

long count = strings.stream().filter(string -> string.isEmpty()).count();

System.out.println(count);

4、sorted用于对流进行排序

// 排序后输出2、3、5

IntStream.of(new int[]{5, 2, 3}).sorted().forEach(System.out::println);

5、Collectors

Collectors 类实现了很多归约操作,例如将流转换成集合和聚合元素。Collectors 可用于返回列表或字符串

List<String> strings = Arrays.asList(“abc”, “”, “bc”, “efg”, “abcd”,””, “jkl”);

List<String> filtered = strings.stream().filter(string -> !string.isEmpty()).collect(Collectors.toList());

System.out.println(“筛选列表: ” + filtered);

String mergedString = strings.stream().filter(string -> !string.isEmpty()).collect(Collectors.joining(“, “));

System.out.println(“合并字符串: ” + mergedString);

}

6、统计

一些产生统计结果的收集器也非常有用。它们主要用于int、double、long等基本类型上,它们可以用来产生类似如下的统计结果。

List<Integer> numbers = Arrays.asList(3, 2, 2, 3, 7, 3, 5);

IntSummaryStatistics stats = numbers.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());

参考资料:

Java8中的Stream API详解:Stream的背景及使用_书呆子Rico的博客-CSDN博客_java stream



版权声明:本文为yangzhanghui原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。