zoukankan      html  css  js  c++  java
  • java8 stream 常见用法

    Java8 新出的 stream 流操作集合的,每次想使用时,虽然知道有这个功能,但一时想不出来怎么写,网上查有时候不太好查,因此自己来写一篇总结贴。
    我们新建一个类 Student。

    @Data
    @AllArgsConstructor
    public class Student {
    
        private String id;
    
        private String name;
    
        private int age;
    
        //班级名称
        private String className;
    
        //金额
        private BigDecimal amount;
        
    }
    

    操作的是 List studentList 这个变量。

        public static void main(String[] args) {
            List<Student> studentList = new ArrayList<>();
            studentList.add(new Student("1","张三",15,"2班",new BigDecimal(500.34)));
            studentList.add(new Student("1","李四",16,"1班",new BigDecimal(453)));
            studentList.add(new Student("1","王五",14,"3班",new BigDecimal(342.34)));
            studentList.add(new Student("1","小美",15,"2班",new BigDecimal(346)));
            studentList.add(new Student("1","小张",16,"3班",new BigDecimal(222)));
            studentList.add(new Student("1","李磊",14,"4班",new BigDecimal(134)));
    	}
    

    接下来的操作,就是 stream 的常见用法。

    1.获取 List 中某个元素的集合

    //所有学生的姓名集合,distinct 为了去重
    List<String> nameList = studentList.stream().map(Student::getName).distinct().collect(Collectors.toList());
    

    2.过滤 List 中符合某个条件的集合

    //查找集合中姓名=“小张”的学生
    List<Student> filterList = studentList.stream().filter(student->"小张".equals(student.getName())).collect(Collectors.toList());
    

    3.根据某个元素分组计数,类似于 SQL 中的 groupBy(select name,count(*) from student group by name;)

    //每个班级的人数
    Map<String, Long> classNameMap = studentList.stream().collect(Collectors.groupingBy(item -> item.getClassName(), Collectors.counting()));
    

    4.根据某个元素分组求和

    //每个班级学生年龄和
    Map<String, Integer> classAgeMap = studentList.stream().collect(Collectors.groupingBy(Student::getClassName, summingInt(Student::getAge)));
    

    5.计算集合中某个元素的总和,针对 int,double,long,有以下两种方式。double 类型是 mapToDouble

    //studentList 年龄求和
    int ageSum = studentList.stream().mapToInt(Student::getAge).sum();
    int ageSum1 = studentList.stream().collect(Collectors.summingInt(Student::getAge));
    

    6.计算集合中类型为 Bigdecimal 元素的和

    BigDecimal amountSum = studentList.stream().map(Student::getAmount).reduce(BigDecimal.ZERO, BigDecimal::add);
    

    7.根据某个元素分组

    //根据班级分组   
    Map<String, List<Student>> classMap = studentList.stream().collect(Collectors.groupingBy(Student::getClassName));
    

    8.为某两个元素构建map

    //学生id和姓名map
    Map<String,String> studentIdAndNameMap =  studentList.stream().collect(Collectors.toMap(Student::getId, Student::getName));
    

    这里,如果 id 有重复的,可能会报异常,因此最保险的写法是

    Map<String,String> studentIdAndNameMap =  studentList.stream().collect(Collectors.toMap(Student::getId, Student::getName,(v1, v2) -> v1));
    

    后面加上 (v1, v2) -> v1,意思是如果有重复的值,取前面一个

    运行结果:

    以上是 stream 常见的一些用法,因为 stream 是一个流,因此很多可以一起使用的,比如先过滤再组合

    //年龄>14的学生姓名的集合
    List<String> fillterNameList = studentList.stream().filter(student -> student.getAge() > 14).map(Student::getName).collect(Collectors.toList());
    
    

    你还遇到过哪些常见的用法呢,欢迎在评论区补充。

  • 相关阅读:
    js对象,字符串 互相 转换
    JS 比较两个数组是否相等 是否拥有相同元素
    node 中 安装 yarn
    vue2.0 子组件 父组件之间的传值
    卷积神经网络 使用 Python 实现一个对手写数字进行分类的简单网络
    Tensorflow卷积实现原理+手写python代码实现卷积
    深度学习基础 (十五)--padding,卷积步长与简单卷积神经网络示例
    直白介绍卷积神经网络(CNN)
    直观理解深度学习卷积部分
    理解深度学习中的卷积
  • 原文地址:https://www.cnblogs.com/fightingting/p/14455426.html
Copyright © 2011-2022 走看看