创建stream流:
//单列集合
集合.stream//数组
stream.of(数组)//双列集合
map.entrySet().stream();
stream流的调试:

常用API:
- map:相当于对数据进行一个操作,可以自定义返回值等
stream.map()
- distinct:可以去除流中的相同元素,注意(*该方法依赖的Object的equals方法来判断是否是相同对象,所以要重写equals方法,否则只有对象地址一样时才会被认为是重复*)
- sorted:可以对流中的元素进行排序,传入空参时使用的是实体类的比较方法
- limit:设置流的最大长度,超出部分将被抛弃
- skip:跳过流中的前n个元素,返回剩下的元素
- **flatMap**:map能把一个对象转换成另外一个对象来作为流中的元素,而flatMap可以把一个对象转换成多个对象作为流中的元素
- 中间操作(filter,map,distinct,sorted,limit,skip,flatMap)
- 终结操作(forEach,collect,count,max,min,reduce归并,查找与匹配)
- forEach:遍历所有元素
- count:计算元素数量
- min&max:返回的是option对象,这里和sorted一样,得指定比较规则
- collect:把当前流转换成一个集合(list, set, map)- Collectors.toList()- Collectors.toSet()- Collectors.toMap(key, value)
- anyMatch:可以用来判断是否有任意符合匹配条件的元素,结果为boolean类型
- allMatch:可以用来判断是否都匹配条件,结果也是boolean类型,都符合则为true
- noneMatch:是否都不符合,都不符合则为true
- findAny:获取流中的任意一个元素,该方法无法保证获取的是流中的第一个元素,只是匹配到
- findFirst:获取流中的第一个元素
- reduce:对流中的数据按照你制定的计算方式计算出一个结果,并返回一个Optional描述归约值(如果有)
.map:
/**
*map:有两个参数,第一个参数表示传入的流,第二个表示输出的流
*可以把一个的对象类型的流变成String,int等其他类型的流
*也可以理解为把流中的类型转化成其他类型
*///map Api匿名内部类的写法@Overridepublic ResponseEntity findAll() {List<User> all = myMapper.findAll();all.stream().map(new Function<User, Object>() {@Overridepublic Object apply(User user) {return user.getAge();}})//简化之后流的写法@Overridepublic ResponseEntity findAll() {List<User> all = myMapper.findAll();all.stream().map( user -> user.getAge()).forEach(a->System.out.println(a));// all.stream().map( 流中的元素 -> 获取这个元素的年龄输出).forEach(a->System.out.println(a));return ResponseEntity.ok(all);}
}
.filter
//条件过滤
List<User> collect = all.stream()
.filter(user -> user.id <=2&&user.getIncome().equals("20K"))//筛选id<=2,并且工资=20k的用户
.collect(Collectors.toList());
.distinct()
//去重
List<User> collect = all.stream().filter(user -> user.id <=2&&user.getIncome().equals("20K")).distinct()//对筛选出来的结果去重,用的equals方法比较.collect(Collectors.toList());
.sorted()//排序
List<User> collect = all.stream().filter(user -> user.id <=100).distinct()//对筛选出来的结果去重,用的equals方法比较.sorted()//排序.collect(Collectors.toList());//直接调用.sorted()排序是对Comparable对象进行排序,对象不一样就会报类型转换异常
//解决:
1.用对应的实体类实现Comparable<实体对象的泛型>接口-----重写compareto方法---定义排序方式如下实体类package com.liam.server.entiy;import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;import java.io.Serializable;@Data
@AllArgsConstructor
@NoArgsConstructor
@TableName(value = "tb_user_info")
public class User implements Serializable, Comparable<User>{@Overridepublic int compareTo(User o) {return this.getId()-o.getId();//默认升序}/*** id*/public int id;/*** 昵称*/public String nickname;/*** 用户头像*/public String avatar;/*** 用户标签:多个用逗号分隔*/public String tags;/*** 性别*/public String gender;/*** 年龄*/public String age;/*** 学历*/public String education;/*** 城市*/public String city;/*** 生日*/public String birthday;/*** 封面图片*/public String coverPic;/*** 行业*/public String profession;/*** 收入*/public String income;/*** 创建时间*/public String created;/*** 修改时间*/public String updated;/*** 结婚标识*/public String marriage;/*** 当前页*/@TableField(exist = false)public String page;/*** 当前页大小*/@TableField(exist = false)public String pageSize;}
.limit(n)//获取前n个
List<User> collect = all.stream().filter(user -> user.id <=100).distinct()//对筛选出来的结果去重,用的equals方法比较.sorted()//排序.limit(10)//只获取前10个.collect(Collectors.toList());
.skip(2)//跳过前2个
List<User> collect = all.stream().filter(user -> user.id <=100).distinct()//对筛选出来的结果去重,用的equals方法比较.sorted()//排序.skip(2)//跳过前2个.collect(Collectors.toList());
.flatmap//把对象的其中一个属性变成流操作
第一种用法:
//假设User对象有一个List<Book>集合属性,可以获取到这个集合中每个book的流/*** 用户标签:多个用逗号分隔*/List<Book> list//BOOK实体类
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Book implements Serializable {private String colour;private String size;
}-----------------------------------------------------------------------------
List<String> collect = all.stream().filter(user -> user.id <=100).distinct()//对筛选出来的结果去重,用的equals方法比较.flatMap(user -> user.getBook().stream())//获取每一个book对象的strean流.map(book -> book.getColour())//获取到每本书的颜色.collect(Collectors.toList());第二种用法:
List<Integer> collect = all.stream().filter(user -> user.id <=100).distinct()//对筛选出来的结果去重,用的equals方法比较.flatMap(user -> Arrays.asList(user.getId()).stream())//获取对象中的一个属性变成数组,在生成的strean流,.collect(Collectors.toList());
.foreach
all.stream().filter(user -> user.id <=100).distinct()//对筛选出来的结果去重,用的equals方法比较.flatMap(user -> Arrays.asList(user.getId()).stream())//获取对象中的一个属性变成数组,在生成的strean流,.forEach(integer -> System.out.println(integer));//遍历每一个对象进行操作
.count();//计数
long count = all.stream().filter(user -> user.id <= 100).distinct()//对筛选出来的结果去重,用的equals方法比较.flatMap(user -> Arrays.asList(user.getId()).stream())//获取对象中的一个属性变成数组,在生成的strean流,.count();//计数
.min/.max获取最大和最小值
//匿名内部类的写法
Optional<Integer> max = all.stream().filter(user -> user.id <= 100).distinct()//对筛选出来的结果去重,用的equals方法比较.flatMap(user -> Arrays.asList(user.getId()).stream())//获取对象中的一个属性 变成数组,在生成的strean流,.max(new Comparator<Integer>() {//匿名内部类的写法,传入比较规则@Overridepublic int compare(Integer o1, Integer o2) {return o1-o2;}});//lambda表达式写法Optional<Integer> max = all.stream().filter(user -> user.id <= 100).distinct()//对筛选出来的结果去重,用的equals方法比较.flatMap(user -> Arrays.asList(user.getId()).stream())//获取对象中的一个属性变成数组,在生成的strean流,.max((o1, o2) -> o1-o2);//lambda写法return ResponseEntity.ok(max);
.collect
//转化list
List<User> collect = all.stream().filter(user -> user.id <= 100).distinct()//对筛选出来的结果去重,用的equals方法比较.collect(Collectors.toList());//转化list//转化setSet<User> collect = all.stream().filter(user -> user.id <= 100).distinct()//对筛选出来的结果去重,用的equals方法比较.collect(Collectors.toSet());//转化set//转化mapMap<String, List<Book>> collect = all.stream().filter(user -> user.id <= 100).distinct()//对筛选出来的结果去重,用的equals方法比较//第一个参数指定kay,第二个参数指定values.collect(Collectors.toMap(user -> user.getAge(), user -> user.getBook()));//转化map
简单的API
.anyMatch//判断是否有复合的条件.allMatch//判断是否所有的条件都符合.noneMatch//判断是否所有的条件都不符合.findAny//获取流中的任意一个符合条件的元素--这个有任意性一般不用.findFirst//获取流中的第一个符合条件的元素
.reduce 把流中的元素按照指定方式计算出一个结果
//匿名内部类的写法all.stream().filter(user -> user.id <= 100).distinct()//对筛选出来的结果去重,用的equals方法比较.map(user -> user.getId()).reduce(0,new BinaryOperator<Integer>() {@Overridepublic Integer apply(Integer integer, Integer integer2) {return integer+integer2;//integer:初始值 integer2流中的每个元素 对着两个元素进行操作,然后赋值给integer在return}lamdba表达式写法://匿名内部类的写法,传入比较规则Integer reduce = all.stream().filter(user -> user.id <= 100).distinct()//对筛选出来的结果去重,用的equals方法比较.map(user -> user.getId()).reduce(0, (integer, integer2) -> { return integer + integer2;//integer:初始值 integer2流中的每个元素 对着两个元素进行操作,然后赋值给integer在return});//先用map进行转换,因为前边元素是什么样的,reduce就进行什么样的操作,所以1前边一般先用map进行类型转换在计算
并行流:
//首先并行流是线程安全的
//获取方式
1.stream.parallel()
2.数组.parallelStream()all.parallelStream()//获取并行流//.peek(user -> System.out.println(user.getId()+Thread.currentThread().getName())).filter(user -> user.id <= 100).distinct()//对筛选出来的结果去重,用的equals方法比较.map(user -> user.getId()).reduce(0, (integer, integer2) -> { return integer + integer2;//integer:初始值 integer2流中的每个元素 对着两个元素进行操作,然后赋值给integer在return});