将Map<S,S>转换为List<S>

5
我正在尝试使用lambda表达式将Map<String,String>转换为List<String>。基本上,我想用一个'='将键和值连接起来。这似乎很简单,但我找不到如何做到这一点的方法。
例如:
Map<String, String> map = new HashMap<>();
map.put("a1","b1");
map.put("a2","b2");
map.put("a3","b3");

// Lambda

// Result contains ["a1=b1", "a2=b2", "a3=b3"]
List<String> result;

2
第一步是使用entrySet方法获取可流式处理的内容。 - user2357112
2个回答

8

首先,如果要求只是使用Lambda,您可以将正常的代码放入函数中并调用它:

Function<Map<S,S>,List<S>> function = (Map<S,S> map) -> {
    // conventional Java code
    return result;
};
List<S> list = function.apply(inputMap); 

你可能想使用Java 8的流库。一个流始终由流源、一些中间操作和最终操作组成,最终操作构造了计算结果。

在你的情况下,流源是映射表的条目集,中间操作将每个条目转换为字符串,最终操作将这些字符串收集到列表中。

List<S> list = 
    map.entrySet().stream()
       .map(e -> e.getKey().toString() + 
            "=" + e.getValue().toString())
       .collect(Collectors.toList());

7

对于Java 7,您也可以在一行代码中实现此操作,从Map#toString()开始:

List<String> list = Arrays.asList(map.toString().replaceAll("^.|.$", "").split(", "));

但是它容易受到包含逗号的键/值的影响。

在Java 8中,使用entry流中的Map.Entry#toString()

List<String> list = map.entrySet().stream().map(Object::toString).collect(Collectors.toList());

这个方案不会受逗号的影响。

两种解决方案都利用了Map.Entry#toString()返回"key=value"的事实。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接