【问题标题】:Save hashmap to String using lambda expressions使用 lambda 表达式将 hashmap 保存到 String
【发布时间】:2015-10-24 08:18:47
【问题描述】:

我正在尝试将以下代码的输出保存在一个名为“输出”的字符串变量中。但是,我收到此编译错误“在封闭范围中定义的局部变量输出必须是最终的或有效的最终”。我确实尝试将输出变量声明为 final,但我得到另一个编译错误“无法分配最终的局部变量输出。它必须为空白且不使用复合赋值”有什么建议吗?

        String output = "";
    map.entrySet().stream().sorted(
            Map.Entry.<String, Integer> comparingByValue()
            .reversed()
            .thenComparing(Map.Entry.comparingByKey()))
            .forEach(entry -> {
                output += entry.getKey() + " - " + entry.getValue();
            });

【问题讨论】:

    标签: java lambda hashmap java-8


    【解决方案1】:

    有一个收集器:joining()

    String output = map.entrySet().stream()
            .sorted(Map.Entry.<String, Integer> comparingByValue()
              .reversed()
              .thenComparing(Map.Entry.comparingByKey())
             )
            .map(entry -> entry.getKey() + " - " + entry.getValue())
            .collect(joining());
    

    您还可以添加分隔符:joining(", ")

    【讨论】:

    • 谢谢你的回答,我不知道有什么特殊的方法。谢谢! :)
    【解决方案2】:

    您不能在 lambda 表达式中为局部变量分配新值(当您在 output String 上使用 += 运算符时会发生这种情况)。但是,您可以将 String 切换为 StringBuilder

    StringBuilder output = new StringBuilder();
    map.entrySet().stream().sorted(
            Map.Entry.<String, Integer> comparingByValue()
            .reversed()
            .thenComparing(Map.Entry.comparingByKey()))
            .forEach(entry -> {
                output.append(entry.getKey() + " - " + entry.getValue());
            });
    

    【讨论】:

    • lambda 表达式不需要花括号。如果您要附加到StringBuilder,则应始终使用它,而不是将其与+ 运算符混合使用:.forEach(entry -&gt; output.append(entry.getKey()).append(" - ").append(entry.getValue()))。除此之外,我更喜欢Collectors.joining()...
    • 即使有理由直接从流中写入 StringBuilder,也最好使用forEachOrdered 而不是forEach,因为StringBuilder 不同步。 forEachOrdered 会更自我记录,并且更能抵御有人出现并使您的流平行。
    猜你喜欢
    • 1970-01-01
    • 2019-03-23
    • 2016-02-25
    • 2015-05-26
    • 2021-10-10
    • 2018-05-14
    • 1970-01-01
    • 2013-05-12
    • 1970-01-01
    相关资源
    最近更新 更多