2017-02-02 61 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