使用lambda替换匹配map中键的字符串

时间:2016-03-24 16:26:02

标签: lambda java-8

使用此代码:

import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
import java.util.List;
import java.util.stream.Collectors;

public class Replace
{

    public static void main(String args[]){
        Map<String , String> map = new HashMap<String , String>();
        map.put("eleven", "11");

        String str = "replace the 11";

        List<String> ls = Arrays.asList(str.split(" "));

        ls.stream().map(m -> map.entrySet().forEach(e -> m.replaceAll(m , e.getKey())));
    }

}

我试图取代&#34; 11&#34;在String str中使用&#34;十一&#34;。因此str应转换为&#34;替换11&#34;。

但我收到编译错误:

Multiple markers at this line
    - Type mismatch: cannot convert from Stream<Object> to 
     <unknown>
    - Cannot return a void result

如何替换地图中与字符串值匹配的键的出现?

1 个答案:

答案 0 :(得分:1)

您的地图已回到正面 - 键应为数字:

Map<String , String> map = new HashMap<String , String>();
map.put("11", "eleven"); // etc

然后是一个班轮:

str = Arrays.stream(str.split(" "))
  .map(s -> map.getOrDefault(s, s))
  .collect(Collectors.joining(" "));

因为这段代码在分割上只消耗了1个空格,并且在连接上恰好放回了一个空格,所以保留了单词之间可变数量的空格。

这里有一些测试代码可以显示:

Map<String , String> map = new HashMap<>();
map.put("11", "eleven"); // etc
String str = "one two  three   11  foo";

str = Arrays.stream(str.split(" "))
  .map(s -> map.getOrDefault(s, s))
  .collect(Collectors.joining(" "));

System.out.println(str);

输出:

one two  three   eleven  foo

请参阅此代码正在运行here