• Java8 Stream流如何操作集合,一文带你了解!


    一、基本介绍

    • 概念:Stream是Java8 API的新成员,它允许以声明性的方式处理数据集合。
    • 特点:1.代码简明:函数式编程写出的代码简洁且意图明确,是用stream接口让你从此告别for循环。2.多核友好:Java函数式编程使得编写并运行程序更简单,需要的都是调用方法
    • 流程:1.把集合转换为stream 2.操作stream:stream流在管道中经过中间操作符的处理,最后由最终操作得到前面处理的结果

    二、常用集合操作

    -- 取出集合中对象的指定值-不去重
    List<String> ageList=userList.stream().map(User::getAge).collect(Collectors.toList());
    
    • 1
    • 2
    -- 取出集合中对象的指定值-并去重
    List<String> ageDistinct=userList.stream().map(User::getAge).collect(Collectors.toList())
    .stream().distinct().collect(Collectors.toList());
    
    • 1
    • 2
    • 3
    -- 取出对象中字段等于指定值的 数据
    List<User> age12List=userList.stream().filter(user ->user.getAge().equals("12")).collect(Collectors.toList());
    
    • 1
    • 2
    -- 以对象中的指定值分组
    Map<String,List<User>> ageMap=userList.stream().collect(Collectors.groupingBy(User::getAge));
    
    • 1
    • 2
    -- 以指定字段排序
    List<User> sortAscUserList = userList.stream().sorted(Comparator.comparing(User::getAge)).collect(Collectors.toList());
    List<User> sortDescUserList = userList.stream().sorted(Comparator.comparing(User::getAge).reversed()).collect(Collectors.toList());
    
    • 1
    • 2
    • 3
    -- 取出对象指定字段的最大值
    int maxAge = userList.stream().mapToInt(user -> Integer.valueOf(user.getAge())).max().getAsInt();
    
    • 1
    • 2
    -- List集合中Map对象
    List<Map<String,String>> userList=new ArrayList<>();
    Map<String,String> user1=new HashMap<>();
    user1.put("name","A");user1.put("age","12");userList.add(user1);
    Map<String,String> user2=new HashMap<>();
    user2.put("name","B");user2.put("age","13");userList.add(user2);
    Map<String,String> user3=new HashMap<>();
    user3.put("name","B");user3.put("age","12");userList.add(user3);
    
    List<String> ageList=userList.stream().map(user->user.get("age")).collect(Collectors.toList());
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    三、操作符

    Java Stream的操作符可以分为中间操作符终止操作符两种

    3.1 中间操作符

    流方法含义
    filter用于通过设置的条件过滤元素
    distinct返回一个元素各异(根据元素流所生成元素的hashCode()和equals方法实现)的流
    limit返回一个不超过指定长度的流
    skip返回一个扔掉前n个元素的流
    sort返回排序后的流
    map返回由给定函数应用于此流的元素的结果组成的流
    -- filter 
    List<String> list= Arrays.asList("abc","ab","","","fg",null);
    List<String> notNullList = list.stream().filter(str -> StringUtils.isNotBlank(str)).collect(Collectors.toList());
    System.out.println(notNullList);
    --输出[abc, ab, fg]
    
    List<String> containsList = list.stream().filter(str -> StringUtils.isNotBlank(str) && str.contains("a")).collect(Collectors.toList());
    System.out.println(containsList);
    --输出[abc, ab]
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    -- distinct
    List<String> list= Arrays.asList("abc","ab","ab");
    List<String> distinctList = list.stream().distinct().collect(Collectors.toList());
    System.out.println(distinctList);
    --输出[abc, ab]
    
    • 1
    • 2
    • 3
    • 4
    • 5
    -- limit
    List<String> list= Arrays.asList("abc","ab","ab");
    List<String> limitList = list.stream().limit(2).collect(Collectors.toList());
    System.out.println(limitList);
    --输出[abc, ab]
    
    • 1
    • 2
    • 3
    • 4
    • 5
    -- skip
    List<String> list= Arrays.asList("abc","ab","ab");
    List<String> limitList = list.stream().skip(2).collect(Collectors.toList());
    System.out.println(limitList);
    -- 输出 [ab]
    
    • 1
    • 2
    • 3
    • 4
    • 5
    -- sort
    List<String> list= Arrays.asList("1","3","2");
    List<String> sortList = list.stream().sorted().collect(Collectors.toList());
    System.out.println(sortList);
    --输出[1, 2, 3]
    
    • 1
    • 2
    • 3
    • 4
    • 5
    -- map
    List<String> list= Arrays.asList("abc","ab","ab");
    List<String> mapList = list.stream().map(str->"case_"+str).collect(Collectors.toList());
    System.out.println(mapList);
    --输出[case_abc, case_ab, case_ab]
    
    • 1
    • 2
    • 3
    • 4
    • 5

    3.2 终止操作符

    流方法含义
    anyMatch集合中是否有一个元素满足条件
    allMatch集合中元素是否都满足条件
    noneMatch集合中元素是否都不满足条件
    findFirst返回流的第一个对象的Optional
    collect收集器 将流转换为其他形式
    count返回流元素个数
    -- anyMatch
    List<String> list= Arrays.asList("abc","ab","","","fg",null);
    boolean flag = list.stream().anyMatch(str -> str == null);
    System.out.println(flag);
    -- 输出 true
    
    • 1
    • 2
    • 3
    • 4
    • 5
    -- allMatch
    List<String> list= Arrays.asList("abc","ab","","","fg");
    System.out.println(list.stream().allMatch(str -> str != null));
    -- 输出 true
    
    • 1
    • 2
    • 3
    • 4
    -- noneMatch
    List<String> list= Arrays.asList("abc","ab","","","fg");
    System.out.println(list.stream().noneMatch(str -> str == null));
    -- 输出 true
    
    • 1
    • 2
    • 3
    • 4
    -- findFirst
    List<String> list= Arrays.asList("abc","ab","","","fg");
    System.out.println(list.stream().findFirst().get());
    -- 输出 abc
    
    • 1
    • 2
    • 3
    • 4
    -- collect
    List<String> list= Arrays.asList("abc","ab","","","fg");
    List<String> collectList = list.stream().collect(Collectors.toList());
    System.out.println(collectList);
    -- 输出 [abc, ab, , , fg]
    
    • 1
    • 2
    • 3
    • 4
    • 5
    -- count
    List<String> list= Arrays.asList("abc","ab","","","fg");
    System.out.println(list.stream().count());
    -- 输出5
    System.out.println(list.stream().filter(str-> StringUtils.isNotBlank(str)).count());
    -- 输出3
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
  • 相关阅读:
    词对齐任务:依附于机器翻译
    基于显扬科技自主研发3D机器视觉HY-X5在电池极耳缺陷检测的应用
    众佰诚:开一家抖音小店需要交押金不?
    07【C语言 & 趣味算法】最佳存款方案(采用 从后往前 递推解决)
    FreeRTOS——删除任务
    Android 设计模式六大原则
    阿里云 短信服务——开启验证码防盗刷监控
    Spring FactoryBean 源码讲解
    C语言从文本到执行程序的过程(预编译,编译,汇编)
    Redis 通信协议 -- RESP
  • 原文地址:https://blog.csdn.net/qq_37688023/article/details/128195092