2016-03-24 39 views
-1

使用此代碼映射鍵的字符串:更換匹配使用lambda

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

} 

我試圖在「十一」字符串str取代「11」的出現。所以str應該轉換爲「替換十一個」。

但我收到編譯器錯誤:

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

如何更換地圖匹配字符串值項的出現?

+1

這看起來像這回答你的問題http://stackoverflow.com/q/36172502/1743880 – Tunaki

+0

@Tunaki這是可能的,因爲我剛剛發佈更新? –

回答

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

+0

如果字符串包含可變長度的空間,這可以容納嗎?使用str.split(「(?<=;)|(?=;)」?但是如何在重新加入時包含空間量? –

+0

@ blue-sky你不能這樣。這個想法並不是圍繞空間分割,而是迭代替換並調用'replaceAll'。 – Tunaki

+0

@blue這個變量已經在變量空間中工作了,分割佔用了1個空間,並且恰好有1個空間被放回當遇到多個空格時,由該流處理的「單詞」將是空白(零長度)字符串。 – Bohemian