2、Stream

本文介绍 Java 8 中的 Stream API,包括 Stream 的概念、如何创建 Stream 对象、管道操作、过滤器使用方法及 DoubleStream 接口示例。通过具体案例展示了如何使用 Stream 处理集合数据。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、什么事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]


五、过滤去案例
过滤出Person集合所有男性
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





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值