gpt4 book ai didi

lambda - 对流的 groupBy 结果应用操作

转载 作者:行者123 更新时间:2023-12-03 23:44:18 26 4
gpt4 key购买 nike

我有一个水果列表,其中包含名称和 ID

List<Fruit> fruitList = Arrays.asList(new Fruit("apple", 1), new Fruit("orange", 2), new Fruit("orange", 3));

仅当存在重复的水果名称时,我才想用 name_Id 重命名水果名称,就像我的列表中 Orange 将重命名为 Orange_2 和 Orange_3 但苹果仍将保留 Apple 一样。我怎样才能在单流表达式中做到这一点。

我想出的解决方案是

Map<String, List<Fruit>> fruitMap = fruitList.stream().collect(Collectors.groupingBy(Fruit::getName));

Set<Entry<String, List<Fruit>>> entry = fruitMap.entrySet();

for (Entry<String, List<Fruit>> en : entry) {
List<Fruit> fruit = en.getValue();
if (fruit.size() > 1) {
fruit.stream().map(d -> {
d.setName(d.getName() + "_" + d.getId());
return d;
}).collect(Collectors.toList());
}
}
}

但这不仅仅是一个流表达式。

最佳答案

这是(有点)单行:

fruitList.stream().collect(Collectors.groupingBy(Fruit::getName))
.values().stream()
.filter(list -> list.size() > 1)
.forEach(list -> list.forEach(Fruit::renameWithId));

这假设您在Fruit中有以下方法:

public void renameWithId() {
name = name + "_" + id;
}

如果您无法修改您的 Fruit 类,您可以进行内联重命名:

fruitList.stream().collect(Collectors.groupingBy(Fruit::getName))
.values().stream()
.filter(list -> list.size() > 1)
.forEach(list -> list.forEach(fruit ->
fruit.setName(fruit.getName() + "_" + fruit.getId())));

这些长行话太长了,以至于它们不再是行话,尽管它们的名字如此......此外,代码最终几乎难以阅读,并且维护和测试起来很痛苦。所以我建议你将遍历 map 并将水果重命名的代码移至新方法:

private void renameRepeatedFruits(Map<String, List<Fruit>> fruitMap) {
fruitMap.values().stream()
.filter(list -> list.size() > 1)
.forEach(list -> list.forEach(Fruit::renameWithId));
}

这将使您能够大大简化代码的第一个版本:

renameRepeatedFruits(
fruitList.stream().collect(Collectors.groupingBy(Fruit::getName)));

关于lambda - 对流的 groupBy 结果应用操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44363337/

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