gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 20:51:08 25 4
gpt4 key购买 nike

我想根据某个决定来划分我的列表。我还有一张存储这些决定的 map 。目前我正在更新流中的决定。我觉得这不是一个好的做法,因为我正在使用收集来做除了确定分组标准之外的其他操作。我的另一个选择是再次浏览该流并使用 forEach 更新 map ,但这意味着我使用 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;
}));

最佳答案

我不确定,但看起来你真正想做的更像是

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

其中 XgetSomething() 的返回类型,YgetSomeOtherThing() 的返回类型> 分别。 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 key 。因此,第二个参数不会为 null,除非 getFinalDecision 本身在之前的计算中返回 null

关于java - 如何在 forEach 中执行操作并将其传递给 Java 流中的 groupingBy,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43483791/

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