2015-11-10 22 views
27

Tôi đang cố gắng để chuyển đổi một Map<String, List<String>> đến một Map<String, String>, trong đó giá trị cho mỗi phím là chuỗi doanh được xây dựng bằng cách tham gia tất cả các giá trị trong List trong bản đồ trước đó, ví dụ:Gia nhập một danh sách <String> bên trong một bản đồ

A -> ["foo", "bar", "baz"] 
B -> ["one", "two", "three"] 

nên được chuyển đổi sang

A -> "foo|bar|baz" 
B -> "one|two|three" 

cách thành ngữ để làm điều này bằng cách sử dụng Java 8 Streams API là gì?

Trả lời

30

Bạn có thể sử dụng Collectors.joining(delimiter) cho tác vụ này.

Map<String, String> result = map.entrySet() 
           .stream() 
           .collect(toMap(
            Map.Entry::getKey, 
            e -> e.getValue().stream().collect(joining("|"))) 
           ); 

Trong mã này, mỗi mục trong bản đồ được thu thập vào một bản đồ mới nơi:

  • chìa khóa giữ nguyên
  • giá trị, mà là một danh sách, được thu thập vào một String bằng cách tham gia tất cả các yếu tố cùng nhau
6

Google ổi có một phương thức helper tốt đẹp cho này:

com.google.common.collect.Maps.transformValues(map, x -> x.stream().collect(joining("|"))); 

sử dụng java tinh khiết, điều này sẽ làm việc:

map.entrySet().stream().collect(toMap(Entry::getKey, e -> e.getValue().stream().collect(joining("|")))); 
+3

Cần lưu ý rằng 'Maps.transformValues' không tạo bản đồ nguyên bản độc lập, thay vào đó, hãy xem bản đồ gốc. –

41

Đơn giản chỉ cần sử dụng String.join, không cần phải tạo ra các dòng lồng nhau:

Map<String, String> result = map.entrySet() 
          .stream() 
          .collect(toMap(
           e -> e.getKey(), 
           e -> String.join("|", e.getValue()))); 
Các vấn đề liên quan