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

Java 8 streams - how to filter a list and get a value

假设我有 Animal 对象和后继对象。 其中之一是 Dog,只有他实现了

public interface Barkable{
    Bark getBark();
}

现在,我有

List<Animal> animals 

其中包含所有动物类型,我想收集 Bark 的所有实例
(仅存在于 Dog 中)。
我能行Java 7种风格

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

如何在 Java 8 个流中进行?
它会和 java-8 版本一样快吗?

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

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

至于运行宁时间,你自己去考吧。这将取决于输入列表的大小,并且您可以通过使用 parallelStream() 而不是 stream() 来使其 运行 更快(如果您的输入对于并行流来说足够大有所作为)。