Java--Stream流详解仅供学习

Java 8中新增的Stream可以让你非常方便地对集合进行过滤,映射,切片等各种操作。Stream流可连续调用多个操作,可以单独执行,也可以合并一起执行。

创建Stream
Java 8中通过 Collection 接口增加了 stream() 和 parallelStream() 方法,可以用来生成流。

通过 Collection 系列集合提供的 stream() 或 parallelStream() 生成串行流或并行流

List strings = Arrays.asList("abc", "", "bc", "efg", "abcd","", "jkl");
Stream stream = strings.stream();
// 或者
Stream parallelStream = strings.parallelStream();

通过 Java 8 中提供的 Stream.of() 方法,可以通过显式值创建一个流。它可以接受任何数量的参数

Stream stream = Stream.of("abc", "", "bc", "efg", "abcd","", "jkl");

通过Stream.iterate()方法,可以生成一个无限长度的流,并且每个元素都是通过指定函数生成的。下面是一个生成 10 个随机整数的示例:

Stream.iterate(1, n -> n + 1)
        .limit(10)
        .forEach(System.out::println);

Stream操作
可以在一个 Stream 上执行欲进行的多个操作,并使用Stream API 提供的函数式接口中的方法对流进行扩展。Stream 有以下几种常见的操作:

Intermediate 操作
filter()
map()
sorted()
distinct()
limit()
skip()
Terminal 操作
forEach()
toArray()
reduce()
collect()
min()
max()
count()
anyMatch()
allMatch()
noneMatch()
findAny()
findFirst()

Intermediate 操作是惰性的; 它们立即返回流,但在流的 Terminal 操作执行之前不会执行。Terminal 操作实际上执行流的处理过程,并生成一个结果。

下面是一些常见的 Stream 操作示例:

filter()操作:用于通过设置的条件过滤出元素,返回一个新的流。

List strings = Arrays.asList("abc", "", "bc", "efg", "abcd","", "jkl");
List filtered = strings.stream().filter(string -> !string.isEmpty()).collect(Collectors.toList());

map()操作:用于将一个元素转换成另一个元素,返回一个新的流。

List numbers = Arrays.asList(3, 2, 2, 3, 7, 3, 8, 9);
List squaresList = numbers.stream().map(n -> n * n).distinct().collect(Collectors.toList());

sorted()操作:用于对流进行排序。可以带一个 comparator 作为排序规则。

List sorted = strings.stream().sorted().collect(Collectors.toList());

distinct()操作:用于去重,获取一个包含唯一元素的新流。

List distinct = strings.stream().distinct().collect(Collectors.toList());

limit()操作:用于获取指定数量的元素。

List limitNumbers = numbers.stream().limit(4).collect(Collectors.toList());

skip()操作:用于跳过指定数量的元素。

List skipNumbers = numbers.stream().skip(4).collect(Collectors.toList());

forEach()操作:用于迭代流中的每个数据。
strings.stream().forEach(System.out::println);
collect()操作:将流转化为其他形式。接收一个 Collector 接口的实现,用于给流中元素做汇总的方法。

List strings = Arrays.asList("abc", "", "bc", "efg", "abcd","", "jkl");
Set filteredSet = strings.stream().filter(string -> !string.isEmpty()).collect(Collectors.toSet());
String mergedString = strings.stream().filter(string -> !string.isEmpty()).collect(Collectors.joining(", "));

以下是更多的流操作示例:

reduce()操作:可以将流中的所有元素累加得到一个结果。

List numbers = Arrays.asList(1, 2, 3, 4, 5);
Optional sum = numbers.stream().reduce((x, y) -> x + y);

toArray()操作:将流中的元素转换为数组类型。

List numbers = Arrays.asList(1, 2, 3, 4, 5);
Integer[] numArr = numbers.stream().toArray(Integer[]::new);

min()和max()操作:返回流中的最小或最大元素。

List numbers = Arrays.asList(1, 2, 3, 4, 5);
Optional minVal = numbers.stream().min(Integer::compare);
Optional maxVal = numbers.stream().max(Integer::compare);

anyMatch()操作:用于判断流中的元素是否匹配给定的条件。

List numbers = Arrays.asList(1, 2, 3, 4, 5);
boolean anyMatch = numbers.stream().anyMatch(x -> x % 2 == 0); //是否存在偶数

allMatch()操作:用于判断流中的所有元素是否都匹配给定的条件。

List numbers = Arrays.asList(2, 4, 6, 8, 10);
boolean allMatch = numbers.stream().allMatch(x -> x % 2 == 0);//是否所有元素都是偶数

noneMatch()操作:用于判断流中的所有元素是否都不匹配给定的条件。

List numbers = Arrays.asList(1, 3, 5, 7, 9);
boolean noneMatch = numbers.stream().noneMatch(x -> x % 2 == 0);//是否都不是偶数

findFirst()操作:返回流中的第一个元素。

List numbers = Arrays.asList(1, 2, 3, 4, 5);
Optional firstNum = numbers.stream().findFirst();

findAny()操作:返回流中的任意一个元素。

List numbers = Arrays.asList(1, 2, 3, 4, 5);
Optional anyNum = numbers.stream().findAny();

parallelStream()操作:用于将流并行化。

List numbers = Arrays.asList(1, 2, 3, 4, 5);
int sum = numbers.parallelStream().mapToInt(x -> x).sum();

Stream流是Java 8中非常强大和方便的一种操作集合的方式,更多操作方法可以参考Java官方文档中的Stream流文档进行了解。

你可能感兴趣的:(java,学习)