2017-08-30 7 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。しかし、あなたはまだMap.getOrDefault()で、あなたの利点にするJava 8を使用することができます。

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

これは私が必要なものです。ありがとうございました ! –

関連する問題