2017-08-30 37 views
5

tôi muốn di chuyển ví dụ này để Java 8:Java lọc 8 bản đồ và sắp xếp

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

Đúng ra:

FrontMiddleBack 

Tôi đã thử với entrySet -> dòng nhưng nó không trở lại trong theo đúng thứ tự.

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

Output:

MidleFrontBack 

Tôi có thể có được kết quả tương tự sử dụng Java 8?

+2

mã ban đầu của bạn bị hỏng. 'concat()' không sửa đổi chuỗi nó được gọi. – shmosel

+4

'HashMap' không có thứ tự. Nếu bạn muốn giữ nguyên thứ tự, hãy sử dụng 'LinkedHashMap'. – shmosel

+3

* Tôi đã cố gắng chuyển sang java 8. * Java 8 tương thích ngược. Bạn không phải thay đổi mọi dòng mã (hoặc bất kỳ) nào chỉ vì bạn đã cập nhật Java. – shmosel

Trả lời

5

Bạn có thể truyền qua các phím mong muốn và tham gia các giá trị có mặt:

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

Rất đẹp. Bạn có thể tránh tìm kiếm thêm bằng cách lọc null sau 'get()'. – shmosel

+0

Điều này thật tuyệt. Tôi sẽ đi với điều này. Cảm ơn ! –

9

Luồng đang hơi quá mức ở đây, IMO. Nhưng bạn vẫn có thể sử dụng Java 8 để lợi thế của bạn, với Map.getOrDefault():

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

Điều này tôi cần. Cảm ơn bạn ! –

Các vấn đề liên quan