将<S,S>映射到List <S>

n00*_*00b 5 java lambda java-8 java-stream

我正在尝试将a转换Map<String, String>List<String>使用lambdas.

基本上我想将键和值连接在一起'='.这似乎微不足道,但我找不到如何做到这一点.

例如

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;
Run Code Online (Sandbox Code Playgroud)

Hoo*_*pje 8

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

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

您的意思可能是您想要使用Java 8的流库.流总是由流源,然后是一些中间操作组成,最后是构成计算结果的最终操作.

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

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


Boh*_*ian 7

对于java 7,您也可以在一行中完成,从Map#toString()以下开始:

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

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

在java 8中,使用Map.Entry#toString()条目流:

List<String> list = map.entrySet().stream().map(Object::toString).collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)

这不容易受到逗号的影响.

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