首页 > 解决方案 > Collectors toMap() - 从 Map.Entry 到 Map 结构的值映射器

问题描述

我最近偶然发现了以下问题。

基本上我有一组我想转换为 maps 的对。下面是代码片段:

Set<Map.Entry<String,String> > testSet = new HashSet<>(
            Arrays.asList(
                    entry("key1","value1"),
                    entry("key1","value1")
                    )
    );

    Map<String,Map<String,String>> testMap = testSet
            .stream()
            .collect(
                    Collectors.toMap(
                            entry -> entry.getKey(),
                            entry-> {
                                Map.ofEntries(
                                        entry(entry.getKey(),entry.getValue() + "2")
                                );
                            }
                    )
            );

上面的代码片段无法编译,因为传递给toMap的函数需要对象而不是 Map.Entry 对象,因此编译器找不到特定于 Map.Entry 的方法。

我不知道为什么会发生这种情况,因此感谢您的帮助。

标签: javajava-11collectors

解决方案


它应该是:

Map<String,Map<String,String>> testMap = testSet
        .stream()
        .collect(
                Collectors.toMap(
                        entry -> entry.getKey(),
                        entry -> Map.ofEntries(entry(entry.getKey(),entry.getValue() + "2"))
                )
        );

当您使用带有花括号的 lambda 表达式主体时,它必须包含一个 return 语句(假设相应的函数式接口的方法有一个返回值)。

如果 lambda 表达式的主体只是单个表达式,则不必将其包裹在大括号中。


推荐阅读