2017-08-30 28 views
5

Java 8'e Bu örneği geçirmek istiyorum:Java 8 harita filtre ve sıralama

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

Doğru çıkışı:

FrontMiddleBack 

Ben entryset ile çalıştı -> akışı ama içinde dönmez doğru sipariş.

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

Çıktı:

MidleFrontBack 

Java 8 kullanarak aynı sonucu alabilir miyim?

+2

Orijinal kod bozuldu. concat() ', çağrıldığı dizeyi değiştirmez. – shmosel

+4

'HashMap' sırasız. Siparişi korumak istiyorsanız, 'LinkedHashMap' kullanın. – shmosel

+3

* Java 8'e geçiş yapmayı denedim. * Java 8, geriye doğru uyumludur. Java'yı güncellediğinizden dolayı her bir kod satırını değiştirmeniz gerekmez. – shmosel

cevap

5

İstediğiniz anahtarlarını akışı ve mevcut değerleri katılabilirsiniz:

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

Çok hoş. Get() 'den sonra null'ı filtreleyerek fazladan bir aramayı önleyebilirsiniz. – shmosel

+0

Bu güzel. Bununla devam edeceğim. Teşekkürler ! –

9

Akımlar burada biraz fazla IMO. Ama yine Map.getOrDefault() ile, kendi yararınıza Java 8 kullanabilirsiniz:

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

İhtiyacım olan bu. Teşekkür ederim ! –