2017-08-30 78 views
5

Chcę przenieść ten przykład Java 8:Java filtr 8 map i sortowania

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

Prawidłowe wyjście:

FrontMiddleBack 

Próbowałem z entryset -> strumień, ale nie zwraca się prawidłowa kolejność.

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

wyjściowa:

MidleFrontBack 

mogę uzyskać taki sam efekt przy użyciu Java 8?

+2

Twój oryginalny kod jest zepsuty. 'concat()' nie modyfikuje łańcucha, do którego jest wywoływany. – shmosel

+4

'HashMap' jest nieuporządkowany. Jeśli chcesz zachować porządek, użyj 'LinkedHashMap'. – shmosel

+3

* Próbowałem przeprowadzić migrację do wersji Java 8. * Java 8 jest kompatybilna wstecz. Nie musisz zmieniać każdej (ani żadnej) linii kodu tylko dlatego, że zaktualizowałeś Javę. – shmosel

Odpowiedz

5

można przesyłać na żądane klawisze i dołącz do wartości, które są obecne:

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

Bardzo ładne. Możesz uniknąć dodatkowego wyszukiwania, filtrując wartość null po 'get()'. – shmosel

+0

To jest miłe. Pójdę z tym. Dzięki ! –

9

Strumienie są tu trochę przesadzone, IMO. Ale nadal można używać Java 8 na swoją korzyść, z Map.getOrDefault():

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

To, czego potrzebuję. Dziękuję Ci ! –