2014-12-01 39 views
13

Tôi đang cố gắng thực hiện thao tác bản đồ trên mỗi mục nhập trong đối tượng Map.Bản đồ luồng Java 8 trên bộ mục nhập

Tôi cần lấy tiền tố ra khỏi khóa và chuyển đổi giá trị từ loại này sang loại khác. Mã của tôi đang tiến hành các mục cấu hình từ một Map<String, String> và chuyển sang một Map<String, AttributeType> (AttributeType chỉ là một lớp giữ một số thông tin. Hơn nữa giải thích là không thích hợp cho câu hỏi này.)

Điều tốt nhất tôi đã có thể đưa ra bằng cách sử dụng Java 8 Streams như sau:

private Map<String, AttributeType> mapConfig(Map<String, String> input, String prefix) { 
    int subLength = prefix.length(); 
    return input.entrySet().stream().flatMap((Map.Entry<String, Object> e) -> { 
     HashMap<String, AttributeType> r = new HashMap<>(); 
     r.put(e.getKey().substring(subLength), AttributeType.GetByName(e.getValue())); 
     return r.entrySet().stream(); 
    }).collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue)); 
} 

là không thể xây dựng một Map.Entry do nó là một giao diện làm việc tạo ra các đĩa đơn nhập Map dụ và việc sử dụng các flatMap(), mà dường như xấu xí.

Có phương án nào tốt hơn không? Có vẻ như đẹp hơn để làm điều này bằng cách sử dụng vòng lặp for:

private Map<String, AttributeType> mapConfig(Map<String, String> input, String prefix) { 
    Map<String, AttributeType> result = new HashMap<>(); 
    int subLength = prefix.length(); 
    for(Map.Entry<String, String> entry : input.entrySet()) { 
     result.put(entry.getKey().substring(subLength), AttributeType.GetByName(entry.getValue())); 
    } 
    return result; 
} 

Tôi có nên tránh API Stream cho điều này? Hoặc là có một cách đẹp hơn tôi đã bỏ qua?

+0

'indexes.entrySet() 'là gì? –

+0

@TanmayPatil vị trí tốt, ví dụ cố định. –

Trả lời

44

Đơn giản chỉ cần dịch "cũ cho vòng lặp cách" vào suối:

private Map<String, String> mapConfig(Map<String, Integer> input, String prefix) { 
    return input.entrySet().stream() 
      .collect(Collectors.toMap(entry -> entry.getKey().substring(subLength), entry -> AttributeType.GetByName(entry.getValue()))); 
} 
7

Câu hỏi có thể là một ít ngày, nhưng bạn chỉ có thể sử dụng AbstractMap.SimpleEntry <> như sau:

private Map<String, AttributeType> mapConfig(
    Map<String, String> input, String prefix) { 
     int subLength = prefix.length(); 
     return input.entrySet() 
      .stream() 
      .map(e -> new AbstractMap.SimpleEntry<>(
       e.getKey().substring(subLength), 
       AttributeType.GetByName(e.getValue())) 
      .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue)); 

bất kỳ đối tượng giá trị giống như Cặp nào khác cũng sẽ làm việc (ví dụ: ApacheCommons Pair tuple).

0

Dưới đây là một giải pháp ngắn hơn bởi AbacusUtil

Stream.of(input).toMap(e -> e.getKey().substring(subLength), 
         e -> AttributeType.GetByName(e.getValue())); 
Các vấn đề liên quan