Java 8流 - 如何过滤列表并获取值

时间:2015-01-20 13:35:44

标签: java java-8 java-stream

让我们说我有动物对象和继承者。 其中一个是狗,只有他实施

public interface Barkable{
    Bark getBark();
}

现在,我有

List<Animal> animals 

其中包含所有动物类型,我想收集所有Bark实例 (仅存在于狗中) 我可以做Java 7风格

 ArrayList<Bark> barks = new ArrayList<>();
 for (Animal animal : AnimalsList) {
     if (animal instanceof Barkable){
         barks.add((Barkablle) dog).getBark();
     }
}

如何在Java 8流中执行此操作? 它会和java-8版本一样快吗?

1 个答案:

答案 0 :(得分:4)

您可以使用filter()获取Barkable个实例,然后使用map获取Bark s:

List<Bark> barks = AnimalsList.stream()
                              .filter (a -> a instanceof Barkable) 
                              .map (a -> ((Barkable) a).getBark())
                              .collect (Collectors.toList());

至于运行时间,你必须自己测试。它取决于输入列表的大小,您可以使用parallelStream()而不是stream()来提高运行速度(如果您的输入足够大,以便并行流能够产生差异)。