java8给为我们提供了一个叫Stream流的东西,那么什么是 Stream流了,它是java JDK1.8中用以处理集合的关键抽象概念,Lambda和Stream是JDK1.8中新增的函数式编程中最有靓点的特性了,它可以实现对集合的各种操作,可以执行非常复杂的查询,过滤映射数据等操作。使用StreamApi对集合数据进行操作,就类似于使用Sql执行的数据库查询。Stream Api可以极大提高java程序员的生产力,让程序员写出高效率,高逼格,非常nice的代码。
我们说这个之前,想下生活中的场景:流水线
比如一个台式电脑,他需要经历流水线各个环节各种元器件的组装,测试之后才能流入到消费者手中,那么试想下,java的一个集合需要用到Stream中的各种操作才能得到我们想要的结果吗。我们可以把java将要处理的元素集合看作是一种流,流在管道上传输,并且可以在管道的节点上进行处理,比如筛选,排序,聚合,取最大值最小值等。
我们代码演示下:
/**
* 用户
*/
@Data
public class User {
//姓名
private String name;
//年龄
private String age;
public User(){}
public User(String name, String age) {
this.name = name;
this.age = age;
}
}
在创建Stream流之前,我们来说说创建Stream流的两种方式
1:串行流stream 可以理解为电路中的串联 是只有一个线程去执行的 属于单线程
2:并行流parallelStream 可以理解为电路中的并联 是可以多个线程去执行的 属于多线程
userList.parallelStream();
userList.stream();
转换完流之后,我们可以对集合进行操作
比如我们把List集合转换成Set集合
//定义一个list集合
List<Integer> list = Arrays.asList(1, 1, 1, 2, 3, 4, 5,5);
//list集合转set集合
Set<Integer> set = list.stream().collect(Collectors.toSet());
set.forEach(s-> System.out.println(s));
Set集合是去重集合,所以打印出来如下:
List Stream流t集合转mao集合
首先我们来分析下,list集合里面只有元素列表值, 如果想转换成map集合的情况下,就必须要有key 指定key--user(对象) 那么name属性作为key value就是对应一个user对象
类似于这种格式:Map<name,User>
上代码:
userList.stream().collect(Collectors.toMap());
List<User> userList = new ArrayList<>();
userList.add(new User("柳如是",22));
userList.add(new User("董小宛",28));
userList.add(new User("李师师",20));
userList.add(new User("宋圆圆",21));
userList.add(new User("苏小小",19));
Map<String, User> mapUser = userList.stream().collect(Collectors.toMap(user -> user.getName(), user -> user));
mapUser.forEach((key,value)-> System.out.println(key+"====>>>>>"+value));
评论区有个大佬说这个Collectors.toMap()方法如果出现复的key,value,会抛出异常,我试了下,不试不知道,一试吓一跳,还真抛出了异常!!!
再转map的时候突然报了如下错误
按照我们常规想法,如果给map添加一个一个一模一样的值,那他肯定会覆盖掉之前的那个值,报错是不可能报错的,莫慌。我们拉看下源码,找到问题的源头。
这个toMap方法是一个重载方法:
当然也可以取第一个重复的key
我们代码演示下:
我想取一个key出现的属性值: