gpt4 book ai didi

java - 解密流减少功能

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:16:03 24 4
gpt4 key购买 nike

为什么 c1c2 不被视为两个字符串,而是一个 String 和一个 Integer

Arrays.asList("duck","chicken","flamingo","pelican")
.stream()
.reduce(0,
(c1, c2) -> c1.length() + c2.length(),
(s1, s2) -> s1 + s2);

最佳答案

reduce三种 变体方法,它们的签名和返回类型不同。如果您查看 reduce 的过载有这个签名:

reduce(U identity, BiFunction<U,? super T,U> accumulator, BinaryOperator<U> combiner)

正如您从方法签名中看到的,reduce 的重载有 3 个参数 identity、累加器和组合器。身份值是您传递给 reduce 的初始值,即 (0),然后我们有一个累加器,它基本上将一个附加元素合并到结果中,最后, combiner 的工作是组合所提供的两个值。

所以你问:

Why are both c1 and c2 are not seen as two Strings but instead one String and one Integer?

BiFunction 的第一个参数是 U,在您的情况下是 Integer 因此,用于标识值的类型 必须与第一个参数以及累加器函数 (BiFunction) 的返回类型相同。

除此之外,您需要更改此设置:

(c1, c2) -> c1.length() + c2.length()

为此:

 (c1, c2) -> c1 + c2.length()

重要的是要注意组合器 函数 (s1, s2) -> s1 + s2 根本不会被调用。原因是此特定重载旨在与 parallelStream 一起使用,因此为了使组合器工作,流必须是并行的。否则,只会调用累加器函数。

另一方面,您的完整代码可以简化为:

int result = Stream.of("duck","chicken","flamingo","pelican")
.reduce(0,
(c1, c2) -> c1 + c2.length(),
(s1, s2) -> s1 + s2);

如果您想避免 reduce 的装箱/拆箱开销,甚至更好:

int result = Stream.of("duck", "chicken", "flamingo", "pelican")
.mapToInt(String::length)
.sum();

关于java - 解密流减少功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47245348/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com