【问题标题】:Map values collect to string with streams映射值通过流收集到字符串
【发布时间】:2018-01-29 19:58:44
【问题描述】:

我为HashMap 字段实现了toString,如下所示:

public class Bar {
    private HashMap<String, Foo> m = null; // Foo is a class with defined toString method

    @Override
    public String toString() {
        String eol = System.getProperty("line.separator");
        final String[] ret = {""};
        m.forEach( (k,v) -> ret[0] += v + eol);
        return ret[0];
    }
}

如何用 java 8 流实现这个功能?以下是我尝试不成功的示例(仅用于说明我想要的)

m.values().stream().collect(Collectors.joining()).
m.entrySet().stream().collect(Collectors.joining()).toString();

【问题讨论】:

  • 你为什么要为ret 创建一个数组,然后只使用它的第一个元素?为什么不使用String 数组而不是String?或者,更好的是,StringBuilder
  • @tradeJmark:实际上它是由 inellij Idea 在使用 String 出错后制作的
  • 啊。 IntelliJ 要求您在这里做的基本上是对该语言的破解。幸运的是,将其修复为不被黑客攻击的答案是使用Stream,所以你走在正确的轨道上:)

标签: java string java-8 hashmap


【解决方案1】:

您可以使用.map 函数将每个Map.Entry 集合转换为String 表示。使用.map 函数,您可以专注于输出的每一行应该是什么样子,然后您可以使用.collect(Collectors.joining(eol)) 调用创建结果。您可以在下面找到一个产生所需输出的示例:

@Override
public String toString() {
    final String eol = System.getProperty("line.separator");
    return m.values()
            .stream()
            .map(Foo::toString)
            .collect(Collectors.joining(eol));
}

示例输出:

[foo:something1]
[foo:something2]
[foo:something3]

更新:

您似乎更改了所需的输出。无论如何,整个想法是在.map() 中提供一个函数,该函数将Foo 对象转换为其String 表示。所有其他部分仍然有效。

更新 2:

答案已更新以满足最新的期望。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-08-21
    • 1970-01-01
    • 2021-01-15
    • 1970-01-01
    • 2021-02-24
    • 2018-07-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多