过滤一组地图并收集到一个列表中?

时间:2016-09-17 18:11:43

标签: java filter java-8 java-stream

我还是Java中的新手,我无法理解如何将其转换为单个列表或集合:

我被发送到SomeClassA对象的List中,这些对象有很多字段:

SomeClass: 
   String name
   String someId
   ...
   ImmutableMap<SomeCategory, ImmutableList<SomeClassB>> someMap

(不可变集合来自:com.google.common.collect)

给定SomeClassA列表,我希望结果是SomeClassB的一组。

所以SomeClassA的列表进来了,我希望能够通过它获得一些Map,然后过滤掉某些类别,得出SomeClassB列表,然后最后组合所有列表。

我尝试过几种不同的过滤器和地图组合,但总是会遇到错误的类型或额外的流。这是一个简单的方法吗?

return listOfSomeClassA.stream()
                 .map(objA -> objA.getSomeMap())
                 . // filter someMap entries by the map's keys of category - someCategory.equals("something")
                 . // put together all the lists of those categories == something?? 

1 个答案:

答案 0 :(得分:3)

有一种内置的过滤方法可以按某种条件过滤掉流。如果它的计算结果为false,则将被删除。

return listOfSomeClassA.stream()
    .flatMap(objA -> objA.getSomeMap().entrySet().stream())
    .filter(entry -> "something".equals(entry.getKey()))
    .flatMap(entry -> entry.getValue().stream())
    .collect(Collectors.toList());