【问题标题】:How to get the member of inner object in a list of objects using Java 8如何使用 Java 8 在对象列表中获取内部对象的成员
【发布时间】:2019-12-24 14:42:59
【问题描述】:

我有一个带有对象列表(食谱)的类(菜单)。每个对象(配方)包含另一个对象(项目)和数量。我需要将数据作为 Map 与对象。获取 id 作为 key,数量作为 value。

如何在 Java 8 中做到这一点?

class Menu{
  private List<Recipe> recipes;
}

class Recipe{
   private Item item;
   private Integer quantity;
}

class Item{
   private String itemId;
   private String itemName;
   private String description;
}

我需要通过流式菜单提供&lt;Item.itemId,Recipe.quantity&gt; 的地图

【问题讨论】:

  • "我有一个包含对象和数量列表的类。" - 我没有完全掌握语义。你怎么能有一个数量的多个项目? --- “我需要将数据作为 Map with Object.” - 你的意思是 Object?就像在Java 类Object?你为什么要放弃这样的所有类型信息?
  • 我已经编辑并转发了我的问题@Turing85

标签: java collections java-8 java-stream


【解决方案1】:

试试这个

Map<String, Integer> map = recipes.stream()
                .collect(Collectors.groupingBy(recipe -> recipe.getItem().getItemId(),
                        Collectors.summingInt(Recipe::getQuantity)));

一个例子:

注意:为了演示,我只填写了部分字段

List<Recipe> recipes = new ArrayList<>();
Recipe r1 = new Recipe();
r1.setQuantity(2);
Item i1 = new Item();
i1.setItemId("1");
r1.setItem(i1);

Recipe r2 = new Recipe();
r2.setQuantity(5);
Item i2 = new Item();
i2.setItemId("1");
r2.setItem(i2);

Recipe r3 = new Recipe();
r3.setQuantity(3);
Item i3 = new Item();
i3.setItemId("2");
r3.setItem(i3);

recipes.addAll(Arrays.asList(r1, r2, r3));

Map<String, Integer> map = recipes.stream()
        .collect(Collectors.groupingBy(recipe -> recipe.getItem().getItemId(),
                Collectors.summingInt(Recipe::getQuantity)));

System.out.println(map);

输出:

{id2=3, id1=7}

没有 lambdas,你可以这样做

Map<String, Integer> result = new HashMap<>();
for (Recipe recipe : recipes) {
    String key = recipe.getItem().getItemId();
    if (!result.containsKey(key)) {
        result.put(key, recipe.getQuantity());
    } else {
        result.put(key, recipe.getQuantity() + result.get(key));
    }
}

System.out.println(result);

【讨论】:

  • 这里有没有不使用 lambdas 的方法?
  • 是的,总会有替代解决方案。你想使用迭代方法吗?
  • 不。不是迭代方法。大概方法参考
  • @SaravanaKumarSK 你在找什么?答案没有解决你的问题吗?
  • 解决了。事实上,我知道这两个答案。我一直在寻找不使用 lambda 来获取它的东西
【解决方案2】:

你可以这样做:

Map<String, Integer> map = menu.getRecipes().stream()
                .collect(Collectors.toMap(recipe -> recipe.getItem().getItemId(), recipe -> recipe.getQuantity()));

示例完整代码:

import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

public class Main {
    public static void main(String[] args) {
        Item item1 = new Item("1", "Item1", "Item1 Description");
        Item item2 = new Item("2", "Item2", "Item2 Description");
        Item item3 = new Item("3", "Item3", "Item3 Description");

        Recipe recipe1 = new Recipe(item1, 3);
        Recipe recipe2 = new Recipe(item2, 5);
        Recipe recipe3 = new Recipe(item3, 7);

        Menu menu = new Menu();
        menu.getRecipes().add(recipe1);
        menu.getRecipes().add(recipe2);
        menu.getRecipes().add(recipe3);

        // System.out.println(menu.getRecipes());

        Map<String, Integer> map = menu.getRecipes().stream()
                .collect(Collectors.toMap(recipe -> recipe.getItem().getItemId(), recipe -> recipe.getQuantity()));

        map.forEach((k, v) -> System.out.println(k + " => " + v));
    }
}

class Menu {
    private List<Recipe> recipes;

    Menu() {
        recipes = new ArrayList<Recipe>();
    }

    public List<Recipe> getRecipes() {
        return recipes;
    }
}

class Recipe {
    private Item item;
    private Integer quantity;

    public Recipe(Item item, Integer quantity) {
        super();
        this.item = item;
        this.quantity = quantity;
    }

    public Item getItem() {
        return item;
    }

    public Integer getQuantity() {
        return quantity;
    }

    @Override
    public String toString() {
        return "Recipe [item=" + item + ", quantity=" + quantity + "]";
    }
}

class Item {
    private String itemId;
    private String itemName;
    private String description;

    public Item(String itemId, String itemName, String description) {
        super();
        this.itemId = itemId;
        this.itemName = itemName;
        this.description = description;
    }

    public String getItemId() {
        return itemId;
    }

    @Override
    public String toString() {
        return "Item [itemId=" + itemId + ", itemName=" + itemName + ", description=" + description + "]";
    }
}

输出:

1 => 3
2 => 5
3 => 7

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-09-29
    • 1970-01-01
    • 1970-01-01
    • 2021-05-10
    • 1970-01-01
    • 2020-09-11
    • 1970-01-01
    • 2019-06-06
    相关资源
    最近更新 更多