繁体   English   中英

如何生成列表的 Map 的 Map(地图<string, map<enum, list<string> &gt;&gt;) 在 java 中使用流</string,>

[英]How do I generate a Map of Map of List (Map<String, Map<Enum, List<String>>>) in java using streams

鉴于:

enum Food{
FRUITS, VEGGIES;
}

Map<String, List<String>> basketMap = new HashMap<>();
basketMap .put("bucket1", Arrays.asList("apple", "banana"));
basketMap .put("bucket2", Arrays.asList("orange", "kiwi"));
basketMap .put("bucket3", Arrays.asList("banana", "orange"));

需要生成列表的map的Map(popultefruitBaskerMap)

Map<String, Map<Food, List<String>> fruitBasketMap = new HashMap<>();

最终 output:

fruitBasketMap:
[
bucket1, [Food.FRUITS, {"apple", "banana"}],
bucket2, [Food.FRUITS, {"orange", "kiwi"}],
bucket3, [Food.FRUITS, {"banana", "orange"}]
]

我尝试了以下(但没有成功)

fruitBasketMap = basketMap.entrySet().stream().collect(
    Collectors.toMap(Map.Entry::getKey,
        Collectors.toMap(Food.FRUITS,
            Collectors.toList(Map.Entry::getValue())
        )
    )
);

有人可以让我知道我该怎么做吗?

此实现似乎正在工作(使用 Java 9 Map.of):

Map<String, Map<Food, List<String>>> fruitBasketMap = basketMap.entrySet().stream()
        .map(e -> Map.entry(e.getKey(), Map.of(Food.FRUITS, e.getValue())))
        .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));

Output的测试:

{
bucket2={FRUITS=[orange, kiwi]}, 
bucket3={FRUITS=[banana, orange]}, 
bucket1={FRUITS=[apple, banana]}
}

这应该以Java 8+方式解决问题:

fruitBasketMap = 
    basketMap.entrySet()
             .stream()
             .collect(groupingBy(Entry::getKey,
                                 toMap(e -> Food.FRUITS, Entry::getValue)));

上面的收集器按以下方式工作:

  1. 通过键对元素进行分组,因此键与原始 map 中的键相同。
  2. 将条目收集到新的 map 中
    • 键:Food.FRUITS(所有条目的常量)
    • value:原始值(字符串列表)

这适用于 Java 8

Map<String, Map<Food, List<String>>> collect = basketMap.entrySet().stream().collect(
                Collectors.toMap(basketMapEntry -> basketMapEntry.getKey(),
                        basketMapEntry -> basketMapEntry.getValue().stream()
                                .collect(Collectors.groupingBy(
                                        item -> type.get(item)
                                        )
                                )
                )
        );

我正在使用 groupingBy 收集器根据枚举对项目列表进行分组。 假设有一个 Map 可以根据条目了解 Food 的价值。 就像是:

Map<String, Food> type = new HashMap<>();
        type.put("apple", Food.FRUITS);
        type.put("banana", Food.FRUITS);
        type.put("orange", Food.FRUITS);
        type.put("kiwi", Food.FRUITS);
        type.put("kiwi", Food.FRUITS);
        type.put("potato", Food.VEGGIES);
        type.put("carrot", Food.VEGGIES);

您可以通过 Java-8 方式本身实现此目的。 试试下面的一个。 由于内部 map 将始终有单个条目,您可以使用singletonMap

Map<String, Map<Food, List<String>>> result = basketMap.entrySet()
                .stream()
                .collect(Collectors.toMap(Map.Entry::getKey, entry -> Collections.singletonMap(Food.FRUITS, entry.getValue())));

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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