想想这门课-
Class Person {
private Integer age;
private Integer getAge() {
return this.age;
}
}
List<Person> list = new ArrayList<Person>
..大约20个示例
现在我必须找到所有的成年人(年龄〉= 18)我有两种方法来做它与流-
1.
list.stream()
.map(person -> person.getAge())
.filter(age -> age >= 18)
.count()
型
1.
list.stream()
.filter(person -> person.getAge() >= 18)
.count()
现在我的问题是:方法1会增加额外的迭代来执行任务,还是像方法2一样只进行一次迭代?
4条答案
按热度按时间zynd9foi1#
一个流只能被消耗一次,所以没有“额外的迭代”。有一个额外的步骤,所以从技术上讲,第二个更有效。然而,你必须有数百万个元素,即使这样,它也几乎不明显。
在这种情况下,它主要是一个选择,在哪种风格你更喜欢。因为他们都很容易阅读,第二个更有意义,因为它更简单。
aor9mmx12#
Stream.filter和Stream.map是返回新流的中间操作。但是这些中间操作总是***懒惰的***:https://docs.oracle.com/javase/8/docs/api/java/util/stream/package-summary.html#StreamOps
懒惰地处理流允许显著的效率;在诸如上述滤波器-Map-求和示例的流水线中,滤波、Map和求和可被融合到对数据的单次通过中,具有最小的中间状态。
c9qzyr3d3#
使用Java流操作有时候可能有点棘手。
我将向您展示一个用Kotlin编写的示例,并显示反编译版本
想象一个namevalue的类成员
通过这些代码,我想按年龄的值过滤姓名
功能A:使用过滤器和Map
功能B:使用简单的Foreach
A功能是多么美丽!!
现在,让我们看看引擎盖下发生了什么:
事实上,函数A使用Two While迭代器来执行相同的操作
我知道这有点乱
功能A:使用过滤器和Map
}
功能B:使用简单的Foreach
}
z18hc3ub4#
实际上第二种方法更好,因为每个
stream
方法都会产生一个新的流。例如,map
方法返回一个new流,这里有一个文档,所以从计算次数的Angular 来看,第二种方法更便宜顺便说一句,在第二个示例中,看起来您做了一个错误的sprint:不是
list.filter
而是list.stream().filter