当前位置: 首页 > 知识库问答 >
问题:

如何在forEach中执行操作并将其传递给Java流中的groupingBy

常永怡
2023-03-14

我想根据某一个决定来划分我的一个列表。我也有一个地图存储这些决定。目前,我正在更新流本身中的决定。我觉得这不是一个好的做法,因为我正在使用collect来执行其他操作,而不是计算分组标准。我有的另一个选择是再次遍历流,并使用forEach更新映射,但这意味着我将使用getFinalDecision两次。有没有更好的办法?有没有一种方法可以在forEach中执行getFinalDecision并将其传递给GroupingBy?

val test = myList.stream().collect(groupingBy(t -> {
      A a = my_map.get(t.getSomething());
      A finalDecision = getFinalDecision(t.getSomeOtherThing(), a);
      my_map.put(t.getSomething(), finalDecision);
      return finalDecision;
}));

共有1个答案

阎鸿煊
2023-03-14

我不确定,但看起来你实际上想做的更像是

Map<X,Y> result = myList.stream()
    .collect(groupingBy(t -> t.getSomething(),
         reducing(null, t -> t.getSomeOtherThing(), (a,b) -> getFinalDecision(b,a) )));

其中,xGetSomething()的返回类型,yGetSomething()的返回类型。GetFinalDecision(…)。当然,它也起作用,如果xy是同一类型。

这将模仿原始代码中初始为空的映射的行为,导致null作为第二个参数传递给GetFinalDecision以获得每个不同键的第一次出现。然后,第二个参数将是之前对该键的GetFinalDecision求值的结果。

Map<X,Y> result = myList.stream()
    .collect(groupingBy(t -> t.getSomething(), mapping(t -> t.getSomeOtherThing(),
        collectingAndThen(reducing((a,b) -> getFinalDecision(a,b)), Optional::get))));

该值最初将是每个不同键的第一个GetSomeOtherthing()调用的结果,并且只有在该键出现一个以上的情况下才会调用GetFinalDecision。因此,第二个参数不会是null,除非GetFinalDecision本身在以前的计算中返回null

 类似资料:
  • 问题内容: 有没有办法将可执行块作为参数传递给静态方法?有可能吗?例如我有这种方法 或类似的东西。实际上,这要复杂得多,我只是简化了这个问题。我试图重构项目,并创建了一个通用实用程序类,其中包含类使用的静态方法。 问题答案: 您可以使用对象: 然后,您可以使用以下命令调用它: 编辑(对不起,@ Bohemian):在Java 8中,可以使用lambdas简化调用代码: 您仍然会以相同的方式声明。l

  • 问题内容: 在使用流的Java 8中,当我一个接一个地链接方法时,将以流水线方式执行操作。 例: 输出:- 但是当我在javascript中尝试类似的时候,结果却不同。正如在javascript中一样,第一个操作完成,然后执行第二个操作。例如:- 输出:- JavaScript中有什么方法可以使其以管道方式执行操作,并且可以像Java程序一样获得输出? 这个问题仅询问如何像JavaScript那样

  • 问题内容: 该文档讨论了使用numba的作为的参数。我需要带有附加参数的相同内容。 我基本上是想做这样的事情: 但是,它不起作用,因为应该是/并且不能将它们转换为。我收到以下错误消息: 我没有找到有关如何从Numba中提取值的任何信息。在C语言中,应该类似于—在Numba中可以做同样的事情吗? 问题答案: 1.通过传递额外的参数 该文件说: 如果用户希望改善集成性能,则可以使用以下签名之一: 该是

  • 我正在尝试反应表,对反应一般是很新的。现在,在下面的代码中,一个本地JSON(mock_data.JSON)被传递到常量数据中。我想用从URL获取的数据替换本地JSON。我怎么能那样做?谢谢:)

  • 我想在我的组件中触发一个动作。这是一个表示组件,不需要重新创建。路由器实现是使用反应路由器冗余完成的。 main.js 应用:日新社: header.js: employee.js: action-creator.js: 道具将不包含动作,因为我没有将它绑定到道具上。我尝试在App.js中编写mapStateToProps和mapDispatchToProps,如下所示: 导出默认连接(mapSt

  • 我有一个工作良好的JSF片段。单击commandbutton时,它应该通过重定向到自身来重新加载页面。 我得到的错误是 javax.el.elException:不是有效的方法表达式:#{redirectTo}(位于com.sun.el.lang.expressionBuilder.CreateMethodExpression(ExpressionBuilder.java:311)(位于com.s