import lombok.Data;
import java.util.Arrays;
import java.util.List;
/**
* 场景:
* 1. 需要ID为偶数
* 2.名字要转成小写
* 3.性别必须为1
* 4.年龄>20岁
* 5.按照名字降序排列
* 6.取1个用户
* 7.用一行代码实现
*/public class StreamDemo {
public static void main(String[] args) {
User u1 = new User( 1,"A" , 12,1 );
User u2 = new User( 2,"B" , 22,1 );
User u3 = new User( 3,"C" , 34,0 );
User u4 = new User( 4,"D" , 8,1 );
User u5 = new User( 5,"E" , 36,2 );
User u6 = new User( 6,"F" , 22,1 );
List<User> listUser = Arrays.asList( u1,u2,u3,u4,u5,u6 );
//用一行代码实现
listUser.stream()
// 过滤ID为偶数
.filter((u)-> u.getId() % 2 == 0 )
// 名字转成小写
.map( (u)-> {u.getName().toLowerCase();return u ;})
//性别必须为1
.filter( u -> u.getSex() == 1 )
//年龄>20岁
.filter( u -> u.getAge() >20 )
//按照名字降序排列 ,
.sorted( (uu1, uu2 )-> uu2.getName().compareTo( uu1.getName() ) )
//取1个用户
.limit( 1 )
. forEach (u-> System.out.println(u));
}
}
//用户类
@Data
class User{
private Integer id;
private String name;
private Integer age;
private Integer sex;
public User(Integer id, String name, Integer age, Integer sex) {
this.id = id;
this.name = name;
this.age = age;
this.sex = sex;
}
}
流的初始化方法

流的关系图:

有以下几个问题需要思考:
- 如何记录每次的操作?
一个完成的操作包括源数据、操作与 回调函数 , 在具体实现中,使用实例化的ReferencePipeline来表示,Head、StatelessOp、StatefulOp的实例。

通过ReduceOps对象找到了ReduceTask, 其实Stream内部的流实现还是使用了ForkJoinTask.
