管道是聚合操作的序列。如果正常用for语句来查找成员。例如,查找符合要求的男性成员:
public class Person {
public enum Sex {
MALE, FEMALE
}
String name;
LocalDate birthday;
Sex gender;
String emailAddress;
// ...
public int getAge() {
// ...
}
public String getName() {
// ...
}
}
for语句的查询:
for (Person p : roster) {
if (p.getGender() == Person.Sex.MALE) {
System.out.println(p.getName());
}
}
使用聚合操作的语句:聚合操作filter和foreach组成的管道来打印集合
roster
.stream()
.filter(e -> e.getGender() == Person.Sex.MALE)
.forEach(e -> System.out.println(e.getName()));
- 源。源可以是一个集合、一个数组、一个生成器函数或一个I/O通道。在本例中,源是集合roster。
- 零个或多个中间操作。
中间操作,比如说filter,会产生新的流。
流是元素的序列。与集合不同,它不是存储元素的数据结构。相反,流通过管道从源传递值。此示例通过调用方法流从集合名册中创建流。filter操作返回包含匹配其谓词的元素的新流(该操作的参数)。在本例中,谓词是lambda表达式e->e.getGender() == Person.Sex.MALE。如果对象e的性别字段是Person.Sex.MALE,则返回布尔值true。因此,在此示例中的filter操作返回包含集合roster中所有男性成员的流。 - 终结操作
终结操作(如forEach)产生非流结果,例如原始值(如double)、集合,或者在forEach的情况下,根本没有值。在本例中,forEach操作的参数是lambda表达式e->System.out.println(e.getName()),它调用对象e上的getName方法。(Java运行时和编译器推断对象e的类型是Person)
作者:HRocky
链接:https://www.jianshu.com/p/6581bd7c35dd