一、什么事Stream
1、Stream在Java8中被定义为泛型接口
2、Stream接口代表数据流。
3、Stream不是一个数据结构,不直接存储数据。
4、Stream通过管道操作数据。
5、创建Stream接口实现类对象:
stream():创建一个Stream接口实现类的对象。
例如:
Stream<Person> perStream=people.stream();//people是Person的List类型。
二、什么是管道
1、管道:代表一个操作序列。
2、管道包含以下组建:
(1)数据集:可能是集合、数组等。
(2)零个或者多个中间业务,如过滤器
(3)一个终端操作,如forEach
三、什么是过滤器
1、过滤器:用给定的条件在源数据基础上过滤出新的数据,并返回一个Stream对象。
2、过滤器包含匹配的谓词。
例如:判断p对象是否为男性的lambda表达式:
Stream<Person> perStream=people.stream();
perStream=perStream.filter(p->p.getGender()=='男');
四、Stream案例
创建一个元素为Person类的集合:People使用Stream和forEach显示该集合所有元素。
package jax.stream;
public class Person {
public static enum Gender{
MAN,WOMAN
}
private String name;
private Gender gender;
private int age;
private int height;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Gender getGender() {
return gender;
}
public void setGender(Gender gender) {
this.gender = gender;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public int getHeight() {
return height;
}
public void setHeight(int height) {
this.height = height;
}
public Person(String name, Gender gender, int age, int height) {
super();
this.name = name;
this.gender = gender;
this.age = age;
this.height = height;
}
public Person() {
super();
}
@Override
public String toString() {
return "Person [name=" + name + ", gender=" + gender + ", age=" + age + ", height=" + height + "]";
}
}
package jax.stream;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Stream;
public class StreamTest {
public static void main(String[] args) {
List<Person> people=createPeople();
Stream<Person> stream=people.stream();
stream.forEach(
//(p)->System.out.println(p.toString()) // 可以去掉p的()号
p->System.out.println(p.toString())
);
}
//集合初始化
static List<Person> createPeople(){
List<Person> people=new ArrayList();
Person p =new Person("xxx",Person.Gender.MAN,22,170);
people.add(p);
p =new Person("YYY",Person.Gender.WOMAN,20,167);
people.add(p);
p =new Person("ZZZ",Person.Gender.MAN,25,179);
people.add(p);
p =new Person("WWW",Person.Gender.WOMAN,23,186);
people.add(p);
return people;
}
}
Person [name=xxx, gender=MAN, age=22, height=170]
Person [name=YYY, gender=WOMAN, age=20, height=167]
Person [name=ZZZ, gender=MAN, age=25, height=179]
Person [name=WWW, gender=WOMAN, age=23, height=186]
package jax.stream;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Stream;
public class FilterTest {
public static void main(String[] args) {
List<Person> people=createPeople();
Stream<Person> stream=people.stream().filter(p->p.getGender()==Person.Gender.MAN);;
stream.forEach(
p->System.out.println(p.toString())
);
}
//集合初始化
static List<Person> createPeople(){
List<Person> people=new ArrayList();
Person p =new Person("xxx",Person.Gender.MAN,22,170);
people.add(p);
p =new Person("YYY",Person.Gender.WOMAN,20,167);
people.add(p);
p =new Person("ZZZ",Person.Gender.MAN,25,179);
people.add(p);
p =new Person("WWW",Person.Gender.WOMAN,23,186);
people.add(p);
return people;
}
}
输出:
Person [name=xxx, gender=MAN, age=22, height=170]
Person [name=ZZZ, gender=MAN, age=25, height=179]
六、DoubleStream接口表示元素类型是double的数据源。
七、DoubleStream接口的常用方法:
1、stream.max().getAsDouble(); 获取流中数据集的最大值
2、stream.min().getAsDouble(); 获取流中数据集的最小值
3、stream.average(); 获取流中数据集的平均值
八、DoubleStream案例
统计people集合中姓名中包涵“X"字的平均身高。
package jax.stream;
import java.util.ArrayList;
import java.util.List;
public class DoubleStreamTest {
public static void main(String[] args) {
List<Person> people=createPeople();
double avg=people.stream().
filter(p->p.getName().contains("X")).
mapToDouble(p->p.getHeight()).
average().
getAsDouble();
System.out.println("包涵X字的所有人身高平均值:"+avg);
}
//集合初始化
static List<Person> createPeople(){
List<Person> people=new ArrayList();
Person p =new Person("XXX",Person.Gender.MAN,22,170);
people.add(p);
p =new Person("YYY",Person.Gender.WOMAN,20,167);
people.add(p);
p =new Person("ZZX",Person.Gender.MAN,25,179);
people.add(p);
p =new Person("WWW",Person.Gender.WOMAN,23,186);
people.add(p);
return people;
}
}
输出:
包涵X字的所有人身高平均值:174.5