2017-08-30 142 views
5

我想這個例子中遷移到Java 8:的Java 8地圖篩選和排序

Map<String, String> data = new HashMap<String, String>() {{ 
    put("name", "Middle"); 
    put("prefix", "Front"); 
    put("postfix", "Back"); 
}}; 

    String title = ""; 
    if (data.containsKey("prefix")) { 
    title += data.get("prefix"); 
} 

if (data.containsKey("name")) { 
    title += data.get("name"); 
} 

if (data.containsKey("postfix")) { 
    title += data.get("postfix"); 
} 

正確的輸出:

FrontMiddleBack 

我試着用的entrySet - >流,但不會返回正確的順序。

String titles = macroParams.entrySet().stream() 
     .filter(map -> "name".equals(map.getKey()) || "postfix".equals(map.getKey()) || "prefix".equals(map.getKey())) 
     .sorted() 
     .map(Map.Entry::getValue) 
     .collect(Collectors.joining()); 

輸出:

MidleFrontBack 

我能使用Java 8相同的結果?

+2

你原來的代碼被打破。 'concat()'不修改它被調用的字符串。 – shmosel

+4

'HashMap'是無序的。如果你想保持排序,使用'LinkedHashMap'。 – shmosel

+3

*我試圖遷移到Java 8. * Java 8向後兼容。您不必因爲更新Java而更改每一行(或任何)的代碼。 – shmosel

回答

5

您可以在流所需的鍵和加入是當前值:

String title = Stream.of("prefix", "name", "postfix") 
     .filter(data::containsKey) 
     .map(data::get) 
     .collect(joining()); 
+1

非常好。您可以通過在get()後過濾null來避免額外的查找。 – shmosel

+0

這很好。我會去這個。謝謝 ! –

9

流在這裏有點矯枉過正,IMO。但你仍然可以使用Java 8,你的優勢,與Map.getOrDefault()

String title = data.getOrDefault("prefix", "") 
     + data.getOrDefault("name", "") 
     + data.getOrDefault("postfix", ""); 
+1

這是我需要的。謝謝 ! –