用 Java 8 Streams 替换传统的 newForLoop

2024-04-06

因此,最终从 Java 6 到 Java 8 有了相对较大的跳跃,我阅读了大量的 Java 8 Streams API。不幸的是,几乎所有被问到的例子都几乎接近我试图弄清楚如何做的事情,但还不够接近。

我拥有的是

final List<Function<? super Double, Double>> myList = generateList();
final double myVal = calculate(10);

private double calculate(double val) {
    for (Function<? super Double, Double> function : this.myList) {
        val += function.apply(val);
    }
    return val;
}

现在,我开始明白我可以做类似的事情.stream().forEach(),但这仅适用于 foreach 和流需要最终变量。我尝试探索一下DoubleStream得到一个sum(),但我需要将当前总和重新应用于每个Function并将该总和添加到下一个函数,如上面的代码示例所示。

这可以用纯 Stream API 实现吗?

编辑:所以在测试之后reduce()区域,我对执行此类计算所需的时间进行了简单的测试,结果不利于流。这是一个例子https://gist.github.com/gabizou/33f616c08bde5ab97e56 https://gist.github.com/gabizou/33f616c08bde5ab97e56。其中包括相当基本的测试的日志输出。


您可以使用流 API 从函数列表中组合一个函数。

static List<Function<? super Double, Double>> myList
    = Arrays.asList(d -> d + 4, d -> d * 2, d -> d - 3);

static Function<Double, Double> total=myList.stream()
    .map(f -> (Function<Double, Double>) d -> d + f.apply(d))
    .reduce(Function::andThen).orElse(Function.identity());

static double calculate(double val) {
    return total.apply(val);
}

public static void main(String[] args) {
    System.out.println(calculate(10));
}

生成组合函数的流操作不存在关联性问题,理论上甚至可以并行运行(尽管这里没有任何好处),而结果是单个函数,其本身是顺序的,并且永远不会分解为需要的部分具有关联性。

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

用 Java 8 Streams 替换传统的 newForLoop 的相关文章

随机推荐

  • SQL Server分页查询

    呃呃呃 我已经为此苦苦挣扎了很长时间 我可以用 MySQL 轻松做到这一点 但用 SQL Server 就不行 这是应该连接在一起的简化表格 通过使用内连接语法将所有这些组合起来 我必须编写一个查询以用于将来的分页 顺便说一句 PHP 假设
  • 从字典和数组的 plist 中读取/写入数据,并将不同级别加载到 TableView 中

    我对使用属性列表有点困惑 我已经阅读了有关该主题的大多数其他问题 但我仍然很困惑 因为它们只进入一层 因此任何帮助将不胜感激 我想加载一个存储数据的plist 如下所示 我的故事板中有三个视图控制器 两个 TableView 控制器和一个空
  • Android获取当前歌曲播放和歌曲更改事件,例如Musixmatch

    我想要实现的目标非常相似是在做 我需要在音乐开始播放以及歌曲更改时得到通知 所有这些都在服务中 因为我的应用程序可能会关闭 甚至 musicmatch 也会这样做 在上述情况下 即使 Musixmatch 应用程序未运行 当我在 Spoti
  • 如何从 XMLReader 获取属性

    我有一些 HTML 正在转换为Spanned using Html fromHtml 并且我在其中使用了一个自定义标签
  • 如何保持用户登录系统并仅在用户单击注销按钮后注销?

    我正在使用 microsoft asp net 身份的自定义实现 因为我有自定义表 这就是为什么我给出了所有方法的自定义实现IUserStore 和 IUserPasswordStore 问题是当用户登录时 10 15 分钟后登录用户 会话
  • Angular 模板中可观察对象上的 ObjectUnsubscribedErrorImpl

    我正在使用 Angular 11 并且正在使用以下命令访问组件模板中的可观察对象async pipe 路线的第一次加载 一切都工作得很好 没有错误 当我离开该页面并返回时 出现以下错误 组件模板 成分 import Component On
  • 使用 optaplanner 返回调度问题的多个解决方案

    强文本您好 Optaplanner 专家 我对 OptaPlanner 还很陌生 所以请原谅任何幼稚或基本的问题 我用它来安排 set of jobs A B and C which can be completed by 5 resour
  • 如何在android中禁用已经预订的时段

    我必须禁用已经预订的时段并仅向用户显示可用的时段 在回收站视图中 时间从 09 00Am 到 09 00Pm 可见 已预订的时段应处于禁用模式 并且用户只能选择可用的时段 在主要活动中 我存储从 09 00AM 到 09 00PM 的所有时
  • 如何将 SVN 修订号与我的 ASP.NET 网站同步?

    Stack Overflow 底部有一个颠覆版本号 svn 修订版 679 我想在我的应用程序中使用这种自动版本控制 NET Web Site Application Windows 窗体 WPD 项目 解决方案 我该如何实施 看起来杰夫正
  • 我怎样才能看到csrftoken?

    有没有办法直接在View中获取csrftoken 我想获取当前的 csrftoken 但有时会发生变化 因此从 Cookie 获取它不是一个好主意 有什么办法可以做到这一点吗 Thanks 我相信您正在寻找这个 django middlew
  • 在自定义列中显示日期范围 - 间隙和孤岛

    我有一个看起来像这样的表 Date Name 2017 01 07 A 2017 01 08 A 2017 01 09 A 2017 01 12 A 2017 01 07 B 2017 01 08 B 2017 01 09 B 我希望能够将
  • 尝试通过 Google Drive API 获取文档元数据时出现 404 错误

    我正在使用进行身份验证域范围的委派 https developers google com drive web delegation 我正在恢复谷歌驱动器服务 如下所示 com google api services drive Drive
  • Java Webstart 尝试将 jar 沙箱化为“受信任的库”

    我正在尝试通过 Webstart 加载带有未签名库的签名 jar 但是 我收到 尝试将沙盒 jar 作为可信库打开 错误 我从 jnlp 文件中删除了所有权限设置 如果将其放在那里 我不喜欢这样做 我的库会出现 classnotdefine
  • Three.js - 如何更新 arrowHelper?

    我正在尝试更新 arrowHelper 我尝试过操作箭头对象线中的顶点 设置所有内容dynamic true等等 但我似乎能做到的唯一方法就是删除旧线并绘制新线 有没有办法更新 arrowHelper 因此 您无法通过更改用于创建对象的值来
  • 如何将一个数组拆分为两个分别具有奇数和偶数索引的数组? [复制]

    这个问题在这里已经有答案了 如何将一个数组拆分为两个分别具有奇数和偶数索引的数组 例如 int a new int 1 3 7 8 然后得到两个数组 a1 1 7 a2 3 8 简单地使用重载Where http Where 3CTSour
  • 如何将unix时间戳转换为日期时间

    我正在尝试转换这个unix时间戳1415115303410在日期时间中 这样 private static DateTime UnixTimeStampToDateTime long unixTimeStamp System DateTim
  • 无法在詹金斯奴隶上运行 gradle

    我已经配置了一个 jenkins ubuntu 从机 我想在它上面运行我的 gradle 构建 使用 gradle 插件 问题是 当运行 jenkins 构建作业时 我得到 gradle no daemon info clean build
  • 如何在 VB.NET 中覆盖文本

    我曾经被教导如何使用以下代码附加文本文件 但是每次按下按钮一时如何覆盖该文件 没有人教我 Private Sub Button1 Click ByVal sender As System Object ByVal e As System E
  • 保存和恢复片段状态

    我有一系列的片段 我使用 上一个 和 下一个 按钮在该片段中进行导航 该片段中有许多编辑文本和单选按钮 当通过单击 上一个 按钮加载上一个片段时 我想保存和恢复这些编辑文本和单选按钮中的用户输入 截图 片段1 https i stack i
  • 用 Java 8 Streams 替换传统的 newForLoop

    因此 最终从 Java 6 到 Java 8 有了相对较大的跳跃 我阅读了大量的 Java 8 Streams API 不幸的是 几乎所有被问到的例子都几乎接近我试图弄清楚如何做的事情 但还不够接近 我拥有的是 final List