2017-02-02 63 views
-1

我想從使用Stream API的地圖列表中獲取Long列表。Java 8流:解析地圖列表

這是類如何看起來像:

class Report Bean{ 
    private MarshallableMap data; 
} 

對象數據包含這樣的記錄:( 「身份證」,1),( 「姓名」, 「測試名」)。

我需要從ReportBeans列表中獲取ID列表。 這是我試過的:

List<Long> ids = reportBeans.stream().flatMap(
        m -> m.getData().entrySet().stream() 
          .filter(e -> e.getKey().equals("ID")) 
          .map(Map.Entry::getValue) 
          .map(Long.class::cast)) 
          .collect(Collectors.toList()); 

我得到空的列表。請,我需要建議。謝謝

+0

你肯定有一個關鍵,這正是'「ID」'任何豆? – Moira

+0

分享什麼'MarshallableMap'包含。 「ID」如何相關。也許在類名「ReportBean」中有一個錯字 – nullpointer

回答

3

有很多不必要的流媒體正在進行。我認爲這更適合你的需求:

reportBeans.stream() 
    .map(r -> r.getData().get("ID")) 
    .filter(Objects::nonNull) 
    .map(Long.class:cast) 
    .collect(toList()); 
0

你沒有展示你的類'MarshallableMap'是怎麼樣的。我們有必要提供確切的答案。但是,如果你的「數據」字段是Map<String, String>類型的,你可以得到ID列表方式如下:

 List<Long> ids = reportBeans.stream() 
     .flatMap(
       m -> (m.getData().entrySet().stream() 
         .filter(e -> "ID".equals(e.getKey())) 
         .map(e -> Long.valueOf(e.getValue()))) 
     ) 
     .collect(Collectors.toList()); 
+1

爲什麼你們堅持迭代entrySet? –

+0

@MikhailProkhorov,誰堅持?我的回答只是在OP代碼中進行了一些修改,只做了很少的修改。總有一些方法可以改進一個脫離這個話題的程序。 – VHS