如何使用流从HashMap <e,r>中提取List <d>

时间:2019-01-07 08:15:42

标签: java collections java-8 hashmap java-stream

考虑到这些限制,我想知道如何从List<D>中提取HashMap<E,R>

  • E是一个自定义类;
  • R是一个自定义类,其中包含Set<D>个自定义对象;

我尝试过的方法:我尝试解决this question中的问题。

在先前的情况下,我有一个简单的Map<E,List<R>>,但是在这种情况下,我必须访问目标为R的{​​{1}}类。

在代码的以下部分中,我要做的是获取Set<D>的元素,其国家名称等于给定的参数。

我尝试使用相同的解决方案:

Set<D>

3 个答案:

答案 0 :(得分:4)

我认为flatMap步骤是错误的,因为您的map步骤会将您的Stream<R>转换为Stream<Set<D>>,所以flatMap(List::stream)应该是{{1} }:

flatMap(Set::stream)

此外,正如您在上面注意到的那样,如果不必使用花括号,则代码可以更具可读性。

答案 1 :(得分:4)

为了提高代码的可读性,我建议避免在lambda中甚至在lambda本身中避免不必要的花括号。尽可能使用方法引用

return map.values()
          .stream()
          .map(R::getSet)
          .filter(set -> set.stream()
                            .map(R::getCountry)
                            .anyMatch(countryname::equals))
          .flatMap(Set::stream)
          .collect(toList());

最后的flatMapcollect操作可以缩短为一行:

.collect(ArrayList::new, List::addAll, List::addAll); 

或者如果您使用的是Java 9:

.collect(flatMapping(Set::stream, toList()));

不过,这只是口味的问题。

答案 2 :(得分:3)

  

获取国家名称与给定名称相同的元素集   参数。

您似乎正在寻找

// input as parameter to the method for simplicity
public List<D> method(Map<E, R> map, String countryName) {
    return map.values() // Collection<R>
              .stream() // Stream<R>
              .flatMap(a -> a.getSet().stream()) // Stream<D>
              .filter(t -> t.getCountry().equals(countryName)) // filtered
              .collect(Collectors.toList()); // collected to list
}