[英]Java Stream Api - merge two lists of objects
我正坐在这个简单的问题面前,无法理解......也许为时已晚:)
有一个简单的“食物”class,其中食物有 id 和数量(想象一下购物清单):
public class Food {
private String id;
private Integer amount;
}
有一个包含一个“苹果”的食物列表和另一个包含一个“苹果”和一个“橙子”的食物列表。 方法 addFood 应该使用 stream api 处理两个列表,并返回一个包含两个“苹果”和一个橙色的列表:
List<Food> existingFood = new ArrayList<Food>();
existingFood.add(new Food("apple", 1));
List<Food> foodToAdd = new ArrayList<Food>();
foodToAdd.add(new Food("apple", 1));
foodToAdd.add(new Food("orange", 1));
List<Food> result = addFood(existingFood, foodToAdd);
// result should contain:
// 1. {"apple", 2}
// 2. {"orange", 1}
使用 stream api 最优雅的方法是什么? 谢谢你的帮助!
您可以将Collectors.groupingBy
与Collectors.summingInt
一起使用:
List<Food> result = Stream.of(existingFood, foodToAdd)
.flatMap(List::stream)
.collect(Collectors.groupingBy(Food::getId, Collectors.summingInt(Food::getAmount)))
.entrySet().stream()
.map(e -> new Food(e.getKey(), e.getValue().intValue()))
.collect(Collectors.toList());
输出
Food(id=orange, amount=1)
Food(id=apple, amount=2)
注意:DTO 中的 id 通常是 Integer 或 Long,在这种情况下,id 可以是另一个名称,例如name
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.