Java8流-如何筛选列表并获取值

Java8流-如何筛选列表并获取值,java,java-8,java-stream,Java,Java 8,Java Stream,假设我有动物对象和继承者。 其中一个是狗,只有他一个人 public interface Barkable{ Bark getBark(); } 现在,我有 List<Animal> animals 列出动物 它包含所有动物类型,我想收集所有树皮的实例 (只存在于狗身上)。 我可以用Java 7风格来做 ArrayList<Bark> barks = new ArrayList<>(); for (Animal animal : Anima

假设我有动物对象和继承者。 其中一个是狗,只有他一个人

public interface Barkable{
    Bark getBark();
}
现在,我有

List<Animal> animals 
<代码>列出动物 它包含所有动物类型,我想收集所有树皮的实例
(只存在于狗身上)。
我可以用Java 7风格来做

 ArrayList<Bark> barks = new ArrayList<>();
 for (Animal animal : AnimalsList) {
     if (animal instanceof Barkable){
         barks.add((Barkablle) dog).getBark();
     }
}
ArrayList barks=new ArrayList();
用于(动物:动物列表){
if(可吠叫的动物实例){
吠叫。添加((吠叫)狗。获取吠叫();
}
}
如何在Java 8流中执行此操作?
它会和java-8版本一样快吗?

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

List<Bark> barks = AnimalsList.stream()
                              .filter (a -> a instanceof Barkable) 
                              .map (a -> ((Barkable) a).getBark())
                              .collect (Collectors.toList());
List barks=animallist.stream()
.filter(a->a可编程实例)
.map(a->((可编程)a).getBark())
.collect(Collectors.toList());
至于运行时间,你必须自己测试。它将取决于输入列表的大小,您可以通过使用
parallelStream()
而不是
stream()
(如果您的输入足够大,一个并行流可以产生不同的效果),使它运行得更快。

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

List<Bark> barks = AnimalsList.stream()
                              .filter (a -> a instanceof Barkable) 
                              .map (a -> ((Barkable) a).getBark())
                              .collect (Collectors.toList());
List barks=animallist.stream()
.filter(a->a可编程实例)
.map(a->((可编程)a).getBark())
.collect(Collectors.toList());

至于运行时间,你必须自己测试。它将取决于输入列表的大小,您可以使用
parallelStream()
而不是
stream()
(如果您的输入足够大,可以使并行流发挥作用),从而使其运行更快。

谢谢。检查。顺便说一句:是否需要返回(在filter()处)?@rails不,不是。我只是在安全。编辑了答案。如果使用parallelStream(),对于超过10k个元素的集合,解决方案实际上会更快。与for循环不同的是,并行流可以在所有内核上运行,收集器将同时收集所有barkable。@Christoph Grimmer Dietrich:即使是流API的单线程使用也可以比
for
循环运行得更快,尤其是对于>10k的元素。底层的
拆分器
不仅可以直接访问源
数组列表
的后台数组,
收集器
可以自由选择任何
列表
实现可以收集的内容,也就是说,
for
循环中使用的
ArrayList
在提高容量时必须复制所有元素,而
收集器
可能会返回一个非
公共
列表实现,而该实现不会受到该问题的影响。谢谢。检查。顺便说一句:是否需要返回(在filter()处)?@rails不,不是。我只是为了安全。编辑了答案。如果使用parallelStream(),对于超过10k个元素的集合,解决方案实际上会更快。与for循环不同的是,并行流可以在所有内核上运行,收集器将同时收集所有barkable。@Christoph Grimmer Dietrich:即使是流API的单线程使用也可以比
for
循环运行得更快,尤其是对于>10k的元素。底层的
拆分器
不仅可以直接访问源
数组列表
的后台数组,
收集器
可以自由选择任何
列表
实现可以收集的内容,即,
for
循环中使用的
ArrayList
必须在提高容量时复制所有元素,而
收集器
可能返回一个非
公共
列表实现,而该实现不受该问题的影响。