- Java核心技术·卷Ⅱ:高级特性(原书第10版)
- (美)凯S.霍斯特曼
- 1135字
- 2024-12-20 22:35:57
1.8 收集结果
当处理完流之后,通常会想要查看其元素。此时可以调用iterator方法,它会产生可以用来访问元素的旧式风格的迭代器。
或者,可以调用forEach方法,将某个函数应用于每个元素:
![](https://epubservercos.yuewen.com/F21227/18365861501241106/epubprivate/OEBPS/Images/015-2-i.jpg?sign=1739552828-wxueKarRn8vsKcvIqKMw09CQ18VjPPV1-0-9c97d8f636d83dcc43552e1693db534a)
在并行流上,forEach方法会以任意顺序遍历各个元素。如果想要按照流中的顺序来处理它们,可以调用forEachOrdered方法。当然,这个方法会丧失并行处理的部分甚至全部优势。
但是,更常见的情况是,我们想要将结果收集到数据结构中。此时,可以调用toArray,获得由流的元素构成的数组。
因为无法在运行时创建泛型数组,所以表达式stream.toArray()会返回一个Object[]数组。如果想要让数组具有正确的类型,可以将其传递到数组构造器中:
![](https://epubservercos.yuewen.com/F21227/18365861501241106/epubprivate/OEBPS/Images/016-i.jpg?sign=1739552828-FL5dlYO3J677RMPJESDgjTAmgwucgZIv-0-9e6a4b7cf8812dd793d4d3d105b3a872)
针对将流中的元素收集到另一个目标中,有一个便捷方法collect可用,它会接受一个Collector接口的实例。Collectors类提供了大量用于生成公共收集器的工厂方法。为了将流收集到列表或集中,可以直接调用
![](https://epubservercos.yuewen.com/F21227/18365861501241106/epubprivate/OEBPS/Images/016-2-i.jpg?sign=1739552828-iTjzdtEfBryjW9mEcnmS1Wgp7mFcGIyN-0-30d397b152e6e4e92fc1cb1475196d85)
或
![](https://epubservercos.yuewen.com/F21227/18365861501241106/epubprivate/OEBPS/Images/016-3-i.jpg?sign=1739552828-A9bUlQGxdjtwrcPTKfgwqLXO08wRVzGu-0-f8e3395e614eb010eb15a390402f9ea5)
如果想要控制获得的集的种类,那么可以使用下面的调用:
![](https://epubservercos.yuewen.com/F21227/18365861501241106/epubprivate/OEBPS/Images/016-4-i.jpg?sign=1739552828-p8lu0J8LwnxOsRrstUlUQSkBhnxcPtGy-0-a499ab6066b25aea1d3a23ddb21e152d)
假设想要通过连接操作来收集流中的所有字符串。我们可以调用
![](https://epubservercos.yuewen.com/F21227/18365861501241106/epubprivate/OEBPS/Images/016-5-i.jpg?sign=1739552828-AVvqOkJI2VkkNA9qr3YjNcueYu2CbdBV-0-a0cf84931494ee473be8b9101124d13e)
如果想要在元素之间增加分隔符,可以将分隔符传递给joining方法:
![](https://epubservercos.yuewen.com/F21227/18365861501241106/epubprivate/OEBPS/Images/016-6-i.jpg?sign=1739552828-lcBi0O7WuZs3dfT3dTUUOANS2v8NYIgN-0-3078f0e76cb9ea9f1ccb26fad0ee4a33)
如果流中包含除字符串以外的其他对象,那么我们需要现将其转换为字符串,就像下面这样:
![](https://epubservercos.yuewen.com/F21227/18365861501241106/epubprivate/OEBPS/Images/016-7-i.jpg?sign=1739552828-pzeSou1bF67gaqu6Bi8aPqBmSuYG5Z3l-0-328397412c68c1795e36b94bbd78db78)
如果想要将流的结果约简为总和、平均值、最大值或最小值,可以使用summarizing(Int|Long|Double)方法中的某一个。这些方法会接受一个将流对象映射为数据的函数,同时,这些方法会产生类型为(Int|Long|Double)SummaryStatistics的结果,同时计算总和、数量、平均值、最小值和最大值。
![](https://epubservercos.yuewen.com/F21227/18365861501241106/epubprivate/OEBPS/Images/016-8-i.jpg?sign=1739552828-aUp4TkJxSr95CLN5653rp2LhIFVm4On1-0-41e0a510d28792f8fddbbd8574646e15)
java.util.stream.BaseStream 8
·Iterator<T>iterator()
产生一个用于获取当前流中各个元素的迭代器。这是一种终结操作。
程序清单1-4中的示例程序展示了如何从流中收集元素。
程序清单1-4 collecting/CollectingResults.java
![](https://epubservercos.yuewen.com/F21227/18365861501241106/epubprivate/OEBPS/Images/016-9-i.jpg?sign=1739552828-4jEiidwRy8PFYqridQEomrWDaQ4yAzbZ-0-4c8172117494b53c86e94b9c1fc1a791)
![](https://epubservercos.yuewen.com/F21227/18365861501241106/epubprivate/OEBPS/Images/017-i.jpg?sign=1739552828-ksvwZTqWdCQEEgsczVGKFwsfIzxKL8Rt-0-fe8d902c5f3f74732b1765c1646c8ed5)
![](https://epubservercos.yuewen.com/F21227/18365861501241106/epubprivate/OEBPS/Images/018-i.jpg?sign=1739552828-OnHaF3E6vvHzaK4fbWBVgKFlQgX6Gj40-0-2ac0480f89980e58812d75b8d25a4ef8)
java.util.stream.Stream 8
·void forEach(Consumer<?super T>action)
在流的每个元素上调用action。这是一种终结操作。
·Object[]toArray()
·<A>A[]toArray(IntFunction<A[]>generator)
产生一个对象数组,或者在将引用A[]::new传递给构造器时,返回一个A类型的数组。这些操作都是终结操作。
·<R,A>R collect(Collector<?super T,A,R>collector)
使用给定的收集器来收集当前流中的元素。Collectors类有用于多种收集器的工厂方法。
java.util.stream.Collectors 8
·static<T>Collector<T,?,List<T>>toList()
·static<T>Collector<T,?,Set<T>>toSet()
产生一个将元素收集到列表或集中的收集器。
·static<T,C extends Collection<T>>Collector<T,?,C>toCollection(Supplier<C>collectionFactory)
产生一个将元素收集到任意集合中的收集器。可以传递一个诸如TreeSet::new的构造器引用。?
·static Collector<CharSequence,?,String>joining()
·static Collector<CharSequence,?,String>joining(CharSequence delimiter)
·static Collector<CharSequence,?,String>joining(CharSequence delimiter,CharSequence pref ix,CharSequence suff ix)
产生一个连接字符串的收集器。分隔符会置于字符串之间,而第一个字符串之前可以有前缀,最后一个字符串之后可以有后缀。如果没有指定,那么它们都为空。
·static<T>Collector<T,?,IntSummaryStatistics>summarizingInt(ToIntFunction<?super T>mapper)
·static<T>Collector<T,?,LongSummaryStatistics>summarizingLong(ToLongFunction<?superT>mapper)
·static<T>Collector<T,?,DoubleSummaryStatistics>summarizingDouble(ToDoubleFunction<?super T>mapper)
产生能够生成(Int|Long|Double)SummaryStatistics对象的收集器,通过它可以获得将mapper应用于每个元素后所产生的结果的个数、总和、平均值、最大值和最小值。
IntSummaryStatistics 8
LongSummaryStatistics 8
DoubleSummaryStatistics 8
·long getCount()
产生汇总后的元素的个数。
·(int|long|double)getSum()
·double getAverage()
产生汇总后的元素的总和或平均值,或者在没有任何元素时返回0。
·(int|long|double)getMax()
·(int|long|double)getMin()
产生汇总后的元素的最大值和最小值,或者在没有任何元素时,产生(Integer|Long|Double).(MAX|MIN)_VALUE。