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

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

原文地址:https://www.cnblogs.com/fightingting/p/14455426.html