java8给为我们提供了一个叫Stream流的东西,那么什么是 Stream流了,它是java JDK1.8中用以处理集合的关键抽象概念,Lambda和Stream是JDK1.8中新增的函数式编程中最有靓点的特性了,它可以实现对集合的各种操作,可以执行非常复杂的查询,过滤映射数据等操作。使用StreamApi对集合数据进行操作,就类似于使用Sql执行的数据库查询。Stream Api可以极大提高java程序员的生产力,让程序员写出高效率,高逼格,非常nice的代码。

我们说这个之前,想下生活中的场景:流水线

java的stream用法 java stream_User

比如一个台式电脑,他需要经历流水线各个环节各种元器件的组装,测试之后才能流入到消费者手中,那么试想下,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集合是去重集合,所以打印出来如下:

java的stream用法 java stream_User_02

List Stream流t集合转mao集合

首先我们来分析下,list集合里面只有元素列表值, 如果想转换成map集合的情况下,就必须要有key     指定key--user(对象)    那么name属性作为key    value就是对应一个user对象

类似于这种格式:Map<name,User>

上代码:

userList.stream().collect(Collectors.toMap());

 

java的stream用法 java stream_java_03

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));

 

java的stream用法 java stream_java的stream用法_04

评论区有个大佬说这个Collectors.toMap()方法如果出现复的key,value,会抛出异常,我试了下,不试不知道,一试吓一跳,还真抛出了异常!!!

java的stream用法 java stream_java_05

 再转map的时候突然报了如下错误

java的stream用法 java stream_List_06

 按照我们常规想法,如果给map添加一个一个一模一样的值,那他肯定会覆盖掉之前的那个值,报错是不可能报错的,莫慌。我们拉看下源码,找到问题的源头。

这个toMap方法是一个重载方法:

java的stream用法 java stream_java的stream用法_07

 

java的stream用法 java stream_User_08

 当然也可以取第一个重复的key

我们代码演示下:

java的stream用法 java stream_java_09

 

java的stream用法 java stream_List_10

 我想取一个key出现的属性值:

java的stream用法 java stream_User_11

 

java的stream用法 java stream_List_12