Stream流
java8中新增功能,可以以一种声明的方式处理数据
strea流是一个来自数据源的元素队列,并接支持聚合操作
- 元素是特定类型的对象,形成一个队列.stream并不存储元素,而是按需计算
- *数据源可以是集合.数组等
- *聚合操作
Stream的操作三个步骤
1.创建Stream
一个数据源,获取一个流
2.中间操作
一个中间错做链,对数据源的数据进行处理
3.终止操作
一个终止操作,执行中间操作链,并产生结果
创建Stream
/**
* StreamAPI三个操作步骤:
* 1、创建Stream
* 2、中间操作
* 3、终止操作
*/
public class TestStreamAPI1 {
// 创建Stream
public void test1() {
// 1、可以通过Conllection系列集合提供的顺序流stream()或并行流 parallelStream()
List<String> list = new ArrayList<>();
Stream<String> stream1 = list.stream();
stream1 = list.parallelStream();
// 2、通过Arrays中的静态方法stream()获取数据流
Integer ints[] = new Integer[10];
Stream<Integer> stream2 = Arrays.stream(ints);
// 3、通过Stream类中的静态方法of()
Stream<String> stream3 = Stream.of("aa", "bb", "cc");
String str[] = new String[10];
Stream<String> stream4 = Stream.of(str)
}
}
Stream的中间操作
筛选和切片
- filter
- 过滤器
- limit
- 阶段流,使其元素不超过给定数量
- skip
- 跳过元素
- distinct
- 筛选,进行去重
排序
- sorted
- 自然排序
- sorted
- 定制排序
终止
public void test1() {
// allMatch-检查是否匹配所有元素
boolean b1 = emps.stream()
.allMatch((e) -> e.getStatus().equals(Status.BUSY));
System.out.println(b1);
// anyMatch-检查是否至少匹配一个元素
boolean b2 = emps.stream()
.anyMatch((e) -> e.getStatus().equals(Status.BUSY));
System.out.println(b2);
// noneMatch-检查是否没有匹配所有元素
boolean b3 = emps.stream()
.noneMatch((e) -> e.getStatus().equals(Status.OTHER)); System.out.println(b3);
// findFirst-返回第一个元素
// 需求:按工资排序,获取第一个员工信息
Optional<Employee> op1 = emps.stream()
.sorted((e1, e2) -> Double.compare(e1.getSalary(), e2.getSalary()))
.findFirst();
System.out.println(op1.get());
// findAny-返回当前流中的任意元素
// 需求:找一个空闲状态的员工,添加到开发团队中
Optional<Employee> op2 = emps.parallelStream()// 并行流-多条线程进 行,谁先找到就是谁
.filter((e) -> e.getStatus().equals(Status.FERR))
.findAny();
System.out.println(op2.get());
// count-返回流中元素的总个数
Long count = emps.stream()
.count();
System.out.println(count);
// max-返回流中最大值
// 需求:获取工资最高的员工信息
Optional<Employee> op3 = emps.stream()
.max((e1, e2) -> Double.compare(e1.getSalary(), e2.getSalary()));
System.out.println(op3.get());
// min-返回流中最小值
// 需求:获取公司中工资最少员工的工资
Optional<Double> op4 = emps.stream()
.map(Employee::getSalary)
.min(Double::compare);
System.out.println(op4.get());
}
注意
- Stream自己不会存储元素
- Stream不会改变源对象.相反,会返回一个持有结果的新Stream
- Stream操作是延迟执行的,这意味着他们会等到需要结果的时候才执行