破译Streamreduce函数

2024-05-01

为什么两者都是c1 and c2不被视为两个字符串,而是一个String和一个Integer?

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

three的变化reduce https://docs.oracle.com/javase/8/docs/api/java/util/stream/Stream.html#reduce-U-java.util.function.BiFunction-java.util.function.BinaryOperator-方法,其签名和返回类型有所不同。如果你看一下过载情况reduce https://docs.oracle.com/javase/8/docs/api/java/util/stream/Stream.html#reduce-U-java.util.function.BiFunction-java.util.function.BinaryOperator-它有这个签名:

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

正如您从方法签名中看到的,此重载reduce https://docs.oracle.com/javase/8/docs/api/java/util/stream/Stream.html#reduce-U-java.util.function.BiFunction-java.util.function.BinaryOperator-有 3 个参数identity、累加器和组合器。身份值是您传入的初始值reduce i.e (0),然后我们有了累加器,它基本上将一个附加元素合并到结果中,最后,combinerwho 的工作是将提供的两个值结合起来。

所以你问:

为什么 c1 和 c2 不被视为两个字符串而是一个 字符串和一个整数?

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

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

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

to this:

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

重要的是要注意组合器function (s1, s2) -> s1 + s2根本不会被调用。原因是这个特定的重载被设计为与parallelStream,所以为了让组合器工作,一个流must是平行的。否则,只会调用累加器函数。

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

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();
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

破译Streamreduce函数 的相关文章

随机推荐

  • 从 Jquery UI Sortable 中删除项目

    我试图找出从 JQuery UI 可排序列表中删除项目的正确方法 我创建了一个 JSfiddle 来说明我的问题 基本上 我有几个围绕 JQuery UI 可排序小部件的回调 并且我希望在从小部件中删除元素后立即执行这些回调 这样做的正确方
  • SSRS 两个数据集需要在第二个数据集中使用一个数据集的字段作为参数?

    问题在于 包含数据的 in 字段只是从一组存储过程中提取的数据集中的一条记录 不可触摸 然后将其用作第二个数据集中的参数 任何帮助 将不胜感激 添加参数 选择参数可见性为隐藏 转到默认值 下面的屏幕截图 选择 从查询中获取值 然后选择您的第
  • 关闭彩盒

    我有一个简单的弹出窗口 不是 Iframe 用户可以在其中互相发送邮件 有一个用于发送信息的提交按钮和一个用于关闭叠加层的取消按钮 我确实在关闭按钮工作时遇到了一些麻烦 代码如下所示
  • 如何包装 fortran write 语句

    我想包装 fortran写语句 http software intel com sites products documentation doclib stdxe 2013 composerxe compiler fortran lin 在
  • 在 python 中对自定义类执行集合操作

    我想将 Python 的内置 set 类与我创建的自定义类一起使用 如果我愿意 要创建包含自定义类实例的集合 我需要实现哪些函数才能执行测试 例如 set a set b 它可以开箱即用 但是 在某些情况下 过载是有意义的 eq https
  • Vue父组件访问子组件的compute属性

    在 Vue JS 中 当在数组元素 子元素 的计算属性中进行更改时 我无法监视数组的更改 我在编写的 JSFiddle 示例中总结了这个问题 因此该示例在逻辑上可能没有意义 但它确实显示了我的问题 https jsfiddle net tr
  • 数据库中的 GUID 类型

    GUID不是数据库中的正式数据类型 在我们现有的 SQL Server 设计中 Uniqueidentifier类型用于GUID价值 现在我们正在切换到Sybase数据库 我们应该使用varchar 36 来代替那个Uniqueidenti
  • ZonedDateTime 的 Jackson 反序列化问题

    我在反序列化我正在使用的服务期间使用的类中有以下字段 private ZonedDateTime transactionDateTime 我正在使用的服务可能会使用以下模式返回日期或日期时间 yyyy MM dd T HH mm ss SS
  • 打算在 Android 上打开 Instagram 用户个人资料

    我正在开发一款社交网络应用程序 我们的用户可以将他们的 Instagram 帐户连接到我们的服务 我想直接在他们的官方 Android 应用程序 如果已安装 中打开 Instagram 个人资料 但我找不到任何方法来做到这一点 然而 有一个
  • 在 TypeORM 单表继承中更新实体的类型

    有没有办法将继承实体的类型 在数据库中 更改为不同的实体类型 转换实体为uid from OldType to NewType await em update OldType uid uid entityTypeColumnName New
  • .NET 中的 vista/win7 放大 API

    Win7 Vista SDK中有magnification lib可供使用放大API http msdn microsoft com en us library ms692162 28VS 85 29 aspx对于C 如何在 NET win
  • 在 iOS 8 Today 扩展中获取 parse.com 用户数据时出现异常

    我正在尝试获取 PFUser 的 PFObjects 列表以在 iOS 8 Today Widget 中显示 按照此博客文章 http blog parse com announcements introducing local data
  • Java垂直布局?

    我需要将 JLabel 垂直放置在一些 JButton 上 就像游戏菜单一样 它们都应该居中 我已经下载了 MigLayout 但我不知道如何使用它 所以我只是想要一种方法来垂直和居中定位我的组件 无论 MigLayout 与否 另外 我不
  • 如何在嵌套数组中查找叶数组?

    我在 PHP 中有一个嵌套数组 array 0 gt 5x 1 gt array 0 gt 1 gt 2 gt 3 3 gt array 0 gt 1 gt 2 gt array I want to find this one 0 gt 1
  • OCaml 中类型和模块相等的规则是什么

    我无法理解 OCaml 中模块的平等性 函子应该是适用的 这就是互联网所声称的 但这有时似乎会失败 而且我不太明白其背后的一般规则 这是我的示例代码 module type PT sig end module P struct end le
  • 来自指针的 Typedef const 引用[重复]

    这个问题在这里已经有答案了 可能的重复 为什么允许将指针强制转换为引用 https stackoverflow com questions 5924248 why is it allowed to cast a pointer to a r
  • 了解 django admin readonly_fields

    我创建了一些代码来区分 Django admin 中的两个用户组 从而导致显示所有字段为只读或仅显示其中的一些字段 这些字段直接在 ModelAdmin 类中设置 首先这是代码 class PersonAdmin admin ModelAd
  • python中通过命令查找进程

    在我的 Python 脚本中 我想检查是否otherscript py目前正在 Linux 系统上运行 这psutil http psutil readthedocs io en latest 图书馆看起来是一个很好的解决方案 import
  • 可以匹配具有任意小数位数的非零浮点数的最短正则表达式是什么?

    可以匹配具有任意小数位数的非零浮点数的最短正则表达式是什么 它应该接受像这样的数字 1 5 9652 7 00002 0 8 0 0500 0 58000 0 01 0 000005 0 9900 5 7 5 7 005 但拒绝诸如 02
  • 破译Streamreduce函数

    为什么两者都是c1 and c2不被视为两个字符串 而是一个String和一个Integer Arrays asList duck chicken flamingo pelican stream reduce 0 c1 c2 gt c1 l