将列表流转换为列表中所有对象的流

问题描述 投票:0回答:1

以下lambda表达式获取HashMap的值,获取其宠物列表,将所有宠物添加到ArrayList宠物中,如果满足条件,则打印出每个宠物的名称。

这有效,但是我有点沮丧,我无法一步一步搞清楚如何做,例如,不使用两个lambda表达式。

Map<Integer, Person> people = new HashMap<Integer, Person>();
...
List<Pet> pets = new ArrayList<Pet>();

people.values().stream()
    .map(p->p.getPets())
    .forEach(p->pets.addAll(p)); //note: each person can have multiple pets
pets.stream()
    .filter(p->p.getClass().toString().contains("Cat"))
    .forEach(p->System.out.println(p.getName()));

所以我有办法直接从第2行转到第5行,这实际上会将宠物列表流转换为所有宠物本身的流吗?

java lambda foreach stream java-stream
1个回答
0
投票

您可以将您的操作合并为一个流管道,方法是

List<Pet> cats = people.values().stream()
        .flatMap(p -> p.getPets().stream())
        .filter(p -> p.getClass().toString().contains("Cat")) // prefer Cat.class::isInstance
        .collect(Collectors.toList());

然后像在您的代码中那样对它们执行操作,例如

cats.forEach(cat -> System.out.println(cat.getName()));

代码的整体转换看起来像:

Map<Integer, Person> people = ...;
people.values().stream()
        .flatMap(p -> p.getPets().stream())
        .filter(p -> p.getClass().toString().contains("Cat"))
        .forEach(cat -> System.out.println(cat.getName()));
热门问题
推荐问题
最新问题