1.5 其他流的转换

1.5 其他流的转换

stream 的 distinct() 方法返回一个以去重后的从原始流中产生元素的流。流必须显示的记住已经被看到的。

1
2
3
Stream<String> uniqueWords
= Stream.of("merrily", "merrily", "merrily", "gently").distinct();
// 只有一个 "merrily" 被保留

为了对流进行排序,已排序方法有多种变体。一种适用于可比较元素流,另一种适用于比较器。在这里,我们对字符串进行排序,以使最长的字符串排在最前面:

1
2
Stream<String> longestFirst =
words.stream().sorted(Comparator.comparing(String::length).reversed());

与所有流转换一样,排序方法将产生一个新流,其元素是按排序顺序的原始流的元素。
当然,你可以通过流来对一个集合进行排序,当排序过程是流管道的一部分时,排序方法很有用。
最终,peek方法产生了另一个与原始元素具有相同元素的流,但是每次检索元素时都会调用一个函数。这对于调试很方便:

1
2
3
Object[] powers = Stream.iterate(1.0, p -> p * 2)
.peek(e -> System.out.println("Fetching " + e))
.limit(20).toArray();

当实际访问元素时,将打印一条消息。这样,您可以验证iterate返回的流是否被延迟处理。
为了进行调试,你可以通过 peek() 方法在你想要的地方设置断点。

1
2
3
4
5
java.util.stream.Stream 8
Stream<T> distinct()
• Stream<T> sorted()
• Stream<T> sorted(Comparator<? super T> comparator)
• Stream<T> peek(Consumer<? super T> action)

坚持原创技术分享,您的支持将鼓励我继续创作!