Java 8流减少地图

时间:2017-09-27 20:50:23

标签: java-8 java-stream

我有一个包含多个条目的LinkedHashMap。我想在第一步中将多个条目减少为单个条目,然后将其映射到单个String。 例如: 我从这样的地图开始:

{"<a>"="</a>", "<b>"="</b>", "<c>"="</c>", "<d>"="</d>"}

最后我想得到一个像这样的字符串:

<a><b><c><d></d></c></b></a>

(在这种情况下,String按顺序包含键,而不是相反顺序的值。但这并不重要,我想要一个通用的解决方案)

我想我需要map.entrySet()。stream()。reduce(),但我不知道在reduce方法中写什么,以及如何继续。

2 个答案:

答案 0 :(得分:4)

由于您通过将键与键和值连接起来来减少条目,因此您要查找的标识是一个条目,其中包含键和值的空字符串。

String reduceEntries(LinkedHashMap<String, String> map) {
    Entry<String, String> entry =
        map.entrySet()
           .stream()
           .reduce(
               new SimpleImmutableEntry<>("", ""),
               (left, right) ->
                   new SimpleImmutableEntry<>(
                       left.getKey() + right.getKey(),
                       right.getValue() + left.getValue()
                   )
           );
    return entry.getKey() + entry.getValue();
}

Java 9添加了一个静态方法Map.entry(key, value),用于创建不可变条目。

答案 1 :(得分:0)

这是一个关于我将如何做的例子:

import java.util.LinkedHashMap;

public class Main {

    static String result = "";

    public static void main(String [] args)
    {
        LinkedHashMap<String, String> map = new LinkedHashMap<String, String>();
        map.put("<a>", "</a>");
        map.put("<b>", "</b>");
        map.put("<c>", "</c>");
        map.put("<d>", "</d>");

        map.keySet().forEach(s -> result += s);
        map.values().forEach(s -> result += s);

        System.out.println(result);
    }
}

注意:您可以使用ArrayUtils.reverse()

来反转values()以获得d