繁体   English   中英

Java Stream Api - 合并两个对象列表

[英]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.groupingByCollectors.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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM