gpt4 book ai didi

Java 8 流 - 修改组中的所有元素

转载 作者:搜寻专家 更新时间:2023-10-31 19:42:57 26 4
gpt4 key购买 nike

我有一个 A 类对象的集合

class A {
String code;
long timestamp;
long largestTimestamp;
}

我必须为每个对象填充 largestTimestamp 字段(具有相同代码的对象组中最大的“时间戳”值)。我可以分两步完成,如下所示 -

Map<String, Long> largestTimestampMap = list.stream().collect(Collectors.toMap(A::getCode, A::getTimestamp, Long::max));
list.forEach(a -> a.setLargestTimestamp(largestTimestampMap.get(a.getCode())));

有没有办法将它们组合成一个流链?

最佳答案

是的,您可以将它们组合成一个管道,如下所示:

list.stream()
.map(a -> new A(a.getCode(), a.getTimestamp(),
list.stream()
.filter(b -> a.getCode().equals(b.getCode()))
.mapToLong(A::getTimestamp)
.max().getAsLong()))
.collect(Collectors.toList());

或者,如果您想避免创建新列表,而是像示例中那样修改现有列表,则使用 replaceAll:

list.replaceAll(a -> new A(a.getCode(), a.getTimestamp(),
list.stream()
.filter(b -> a.getCode().equals(b.getCode()))
.mapToLong(A::getTimestamp)
.max().getAsLong()));

但是,我建议避免这种方法:

1) 因为它的性能比您当前的实现更差,所以此解决方案需要再次遍历 list forEach 元素。而您展示的 map 方法只需要一次 get 调用,我们都知道在 map 中查找的速度有多快。

2) 还有更多的代码。

是的,你可以将 map 中间操作中的代码重构为一个方法,使其看起来更短但最终还是更长。

有时最好的方法需要两行或更多行,在这种情况下,最好继续您的方法。

关于Java 8 流 - 修改组中的所有元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53567561/

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