映射值使用流收集到字符串

时间:2017-08-21 16:55:25

标签: java string java-8 hashmap

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

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();

1 个答案:

答案 0 :(得分:3)

您可以使用.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:

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