看它的返回值:
- 如果返回值是Stream,那么是惰性求值;
- 如果返回值是另一个值或为空,那么就是及早求值。
/**
* @author InJavaWeTrust
*/
public final class Person {
private String name;
private String sex;
private String address;
public Person() {
}
public Person(String name, String sex, String address) {
super();
this.name = name;
this.sex = sex;
this.address = address;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public boolean isSex(String sex) {
return this.sex.equals(sex);
}
}
import java.util.ArrayList;
import java.util.List;
/**
* @author InJavaWeTrust
*/
public class Test {
/**
* 惰性求值,这里不会有输出
*/
public void filterSex(List<Person> personLst) {
//如果返回值是Stream,那么是惰性求值
personLst.stream().filter(person -> {
System.out.println("惰性求值 " + person.getSex());
return person.isSex("女");
});
}
/**
* 及早求值,这里有输出
* @param personLst
* @return
*/
public long getSexCount(List<Person> personLst) {
//如果返回值是另一个值或为空,那么就是及早求值
return personLst.stream().filter(person -> {
System.out.println("及早求值 " + person.getSex());
return person.isSex("女");
}).count();
}
public static void main(String[] args) {
Person person1 = new Person("梓涵", "女", "塔克拉玛干");
Person person2 = new Person("梓轩", "男", "喀什");
Person person3 = new Person("浩然", "男", "伊利");
List<Person> personLst = new ArrayList<>();
personLst.add(person1);
personLst.add(person2);
personLst.add(person3);
//惰性求值
new Test().filterSex(personLst);
//及早求值
new Test().getSexCount(personLst);
}
}
及早求值 女
及早求值 男
及早求值 男

本文详细介绍了Java8中Stream API的两种求值方式:惰性求值和及早求值,并通过具体示例代码演示了两者的区别。通过观察返回值类型,可以判断一个操作是惰性求值还是及早求值。
1673

被折叠的 条评论
为什么被折叠?



