讨论/《Java 实战(第 2 版)》 - 6.2.4 广义的归约汇总/
《Java 实战(第 2 版)》 - 6.2.4 广义的归约汇总
共 1 个回复

答案:语句(1)和语句(3)是有效的,语句(2)无法编译。

(1) 这会将每道菜转换为菜名,就像原先使用joining收集器的语句一样。然后用一个String作为累加器归约得到的字符串流,并将菜名逐个连接在它后面。

(2) 这无法编译,因为reducing接受的参数是一个BinaryOperator<t>,也就是一个BiFunction<T,T,T>。这就意味着它需要的函数必须能接受两个参数,然后返回一个相同类型的值,但这里用的Lambda表达式接受的参数是两个菜,返回的却是一个字符串。

(3) 这会把一个空字符串作为累加器来进行归约,在遍历菜肴流时,它会把每道菜转换成菜名,并追加到累加器上。请注意,前面讲过,reducing要返回一个Optional并不需要三个参数,因为如果是空流的话,它的返回值更有意义——也就是作为累加器初始值的空字符串。

请注意,虽然语句(1)和语句(3)都能够合法地替代joining收集器,但是它们在这里是用来展示为何可以(至少在概念上)把reducing看作本章中讨论的所有其他收集器的概括。然而就实际应用而言,不管是从可读性还是性能方面考虑,我们始终建议使用joining收集器。