考虑到这些限制,我想知道如何从List<D>
中提取HashMap<E,R>
:
E
是一个自定义类; R
是一个自定义类,其中包含Set<D>
个自定义对象; 我尝试过的方法:我尝试解决this question中的问题。
在先前的情况下,我有一个简单的Map<E,List<R>>
,但是在这种情况下,我必须访问目标为R
的{{1}}类。
在代码的以下部分中,我要做的是获取Set<D>
的元素,其国家名称等于给定的参数。
我尝试使用相同的解决方案:
Set<D>
答案 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());
最后的flatMap
和collect
操作可以缩短为一行:
.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
}