簡體   English   中英

使用 Java8 將兩個 Map 組合成一個對象列表

[英]Combine two Maps to a List of objects using Java8

給定 2 個地圖和一個 object

Map<Integer, List<String>> fruits = new HashMap<>();
fruits.put(1, Arrays.asList("apple", "banana"));
fruits.put(2, Arrays.asList("orange", "kiwi"));

Map<Integer, List<String>> veggies= new HashMap<>();
veggies.put(1, Arrays.asList("tomato", "potato"));
veggies.put(2, Arrays.asList("onion"));

Class Food
{
    private id;
    private List<String> fruitsList;
    private List<String> veggiesList;

    //getters and setters
}

我正在嘗試將給定的 2 個地圖組合到一個包含食物對象(列表)的列表中。

//Used for explanation purpose
Food food1 = new Food();
food1.setId(1);
food1.setFruitsList(Arrays.asList("apple", "banana"));
food1.setVeggiesList(Arrays.asList("tomato", "potato"));

//Used for explanation purpose
Food food2 = new Food();
food2.setId(2);
food2.setFruitsList(Arrays.asList("orange", "kiwi"));
food2.setVeggiesList(Arrays.asList("onion"));

//Wanted this list of food
List<Food> foodList = new ArrayList();
foodList.add(food1);
foodList.add(food2);

我需要一份清單。 我們可以使用 Java8 流來實現嗎? 任何解決方案將不勝感激。

你可以這樣做:

List<Food> foodList = fruits.keySet().stream()
    .concat(veggies.keySet().stream())
    .distinct()
    .map(id -> {
        Food food = new Food();
        food.setId(id);
        food.setFruitsList(fruits.getOrDefault(id, new ArrayList<>()));
        food.setVeggiesList(veggies.getOrDefault(id, new ArrayList<>()));
        return food ;
    })
    .collect(Collectors.toList());

如果您的Food class 有一個采用三個參數的構造函數,它會變得更加簡潔:

List<Food> foodList = fruits.keySet().stream()
    .concat(veggies.keySet().stream())
    .distinct()
    .map(id -> new Food(
        id,
        fruits.getOrDefault(id, new ArrayList<>()),
        veggies.getOrDefault(id, new ArrayList<>())
    )
    .collect(Collectors.toList());

如果您知道兩張地圖中的 id 相同,則可以跳過.concat().distinct()步驟(這非常昂貴),而只需使用get()而不是getOrDefault()

你也可以(在任何情況下)做

Set<Integer> allKeys = new HashSet<>(fruits.keySet());
allKeys.addAll(veggies.keySet());
List<Food> foodList = allKeys.stream()
    .map(/* as before */)
    .collect(Collectors.toList());

這不是一個“純流”解決方案,但可能更有效。

您可以合並兩個密鑰流並使用不同的方法來僅獲取唯一密鑰。

List<Food> foods = Stream.concat(fruits.keySet().stream() , veggies.keySet().stream())
                         .distinct()
                         .map(e -> new Food(e, fruits.get(e), veggies.get(e)))
                         .collect(Collectors.toList());

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM