原文: https://howtodoinjava.com/java9/stream-api-improvements/
通过示例了解流 API(即takeWhile
/dropWhile
方法,ofNullable
和iterate
方法)中 Java 9 的新改进。
Table of Contents
Limiting Stream with takeWhile() and dropWhile() methods
Overloaded Stream iterate method
New Stream ofNullable() method
使用takeWhile()
和dropWhile()
方法限制Stream
新方法takeWhile
和dropWhile
允许您基于谓词获取流的一部分。 这里的流可以是有序的也可以是无序的,所以:
- 在有序流上,
takeWhile
返回流的“最长前缀”,其元素匹配给定谓词。 - 在无序流上,
takeWhile
返回流的子集,从流的开头开始,其元素匹配给定谓词(但不是全部)。
dropWhile
方法与takeWhile
方法相反。
- 在有序流上,
dropWhile
返回匹配给定谓词的“最长前缀”之后的其余项。 - 在无序流上,
dropWhile
返回不匹配给定谓词的剩余的流元素。
takeWhile
和dropWhile
示例
在此示例中,我们具有从a
到i
的字符列表。 我希望所有可能在迭代中出现在字符d
之前的字符。
List<String> alphabets = List.of("a", "b", "c", "d", "e", "f", "g", "h", "i");
List<String> subset1 = alphabets
.stream()
.takeWhile(s -> !s.equals("d"))
.collect(Collectors.toList());
System.out.println(subset1);
Output:
[a, b, c]
如前所述,dropWhile
的作用与takeWhile
方法相反,因此在上面的示例中,如果使用dropWhile
,它将返回takeWhile
谓词留下的所有字符。
List<String> alphabets = List.of("a", "b", "c", "d", "e", "f", "g", "h", "i");
List<String> subset2 = alphabets
.stream()
.dropWhile(s -> !s.equals("d"))
.collect(Collectors.toList());
System.out.println(subset2);
Output:
[d, e, f, g, h, i]
重载Stream
迭代方法
iterate()
方法用于创建以单个元素(种子)开头的流,并通过依次应用一元运算符来生成后续元素。 结果是无限的流。 为了终止流,使用限制或其他一些短路函数,例如findFirst
或findAny
。
Java 8 中的iterate
方法具有签名:
static Stream iterate(final T seed, final UnaryOperator f)
在 Java 9 中,新的iterate
重载版本将谓词作为第二个参数:
static Stream iterate(T seed, Predicate super T> hasNext, UnaryOperator next)
让我们看看从 Java 8 到 Java 9 的iterate
方法的使用不同。
Java 8 中的迭代方法
List<Integer> numbers = Stream.iterate(1, i -> i+1)
.limit(10)
.collect(Collectors.toList());
System.out.println(numbers);
Output:
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
Java 9 中的迭代方法
List<Integer> numbers = Stream.iterate(1, i -> i <= 10 ,i -> i+1)
.collect(Collectors.toList());
System.out.println(numbers);
Output:
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
在上面的示例中,第一个流是 Java 8 使用限制迭代的方式。 第二个使用谓词作为第二个参数。
新的Stream ofNullable()
方法
在 Java 8 之前,流中不能具有null
值。 会导致NullPointerException
。
在 Java 9 中,ofNullable
方法使您可以创建单元素流,该流将包装一个值(如果不为null
),否则为空流。
Stream<String> stream = Stream.ofNullable("123");
System.out.println(stream.count());
stream = Stream.ofNullable(null);
System.out.println(stream.count());
Output:
1
0
此处,count
方法返回流中非空元素的数量。
从技术上说,Stream.ofNullable()
与流条件上下文中的空条件检查非常相似。
将我的问题放在评论部分。
学习愉快!