Stream流的使用详解(持续更新)

1. 对比两List集合数据某些字段一样的情况下取值:

一般简单方式我们会使用双重for循环来处理判断数据取值(如下代码所示),但是数据量越大的情况下代码效率则越低,并且现在很多公司都会限制for循环层数所以更推荐stream将List转换为Map通过key取值

普通方式:

    for (DashboardsDO aDo : dashboardsDOS) {
            for (Target target : targetList) {
                if (aDo.getStoreCode().equals(target.getStoreCode())) {
                    代码逻辑等等
                }
            }
        }

stream:

        List<Student> list1= new ArrayList<>();
        List<StudentMSG> list2= new ArrayList<>();
        // 假设以上两个list都有数据我们通过学生姓名name与学号num进行取值
        Map<String, StudentMSG> studentMap=list2.stream()
.collect(Collectors.toMap(studentMSG-> studentMSG.getName() + "_" + studentMSG.getNum(), Function.identity()));
        // 此时我们将name与num作为map的key,值为当前实体类
        list1 = list1.stream()
                .map(student-> {
                    // 将list1的name与num作为key
                    String key = student.getName() + "_" + student.getNum();
                    // 通过key取值 
                    StudentMSG studentMSG = studentMap.get(key);
                    // 你的业务逻辑 
                    return student;
                }).collect(Collectors.toList());

2. Stream流过滤出偶数并求和

List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);

// 使用Stream流过滤出偶数并求和
int sumOfEvenNumbers = numbers.stream()
     .filter(n -> n % 2 == 0)
     .mapToInt(Integer::intValue)
     .sum();
System.out.println("Sum of even numbers: " + sumOfEvenNumbers);

3. Stream流将数字转换为字符串并连接成一个字符串

List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
// 使用Stream流将数字转换为字符串并连接成一个字符串
String joinedNumbers = numbers.stream()
        .map(String::valueOf)
        .collect(Collectors.joining(", "));
System.out.println("Joined numbers: " + joinedNumbers);

4.  Stream根据集合某字段进行排序

List<Person> people = new ArrayList<>();
people.add(new Person("张三", 30));
people.add(new Person("李四", 25));
people.add(new Person("王五", 35));
// 根据age字段排序
List<Person> sortedPeople = people.stream()
        .sorted(Comparator.comparingInt(Person::getAge))
        .collect(Collectors.toList());

sortedPeople.forEach(person -> System.out.println(person.getName() + ": " + person.getAge()));

5. Stream根据某字段过滤

        List<Person> people = new ArrayList<>();
        people.add(new Person("张三", 20));
        people.add(new Person("李四", 15));
        people.add(new Person("王五", 25));
        // 过滤年龄大于18岁的人
        List<Person> adults = people.stream()
                .filter(person -> person.getAge() >= 18)
                .collect(Collectors.toList());

        adults.forEach(person -> System.out.println(person.getName() + ": " + person.getAge()));

6. Stream去重

List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 1, 2, 3);
List<Integer> distinctNumbers = numbers.stream().distinct().collect(Collectors.toList());

 7. Stream两个list根据某相同字段去重

        List<MyClass> list1 = new ArrayList<>();
        list1.add(new MyClass("A"));
        list1.add(new MyClass("B"));
        list1.add(new MyClass("C"));

        List<MyClass> list2 = new ArrayList<>();
        list2.add(new MyClass("B"));
        list2.add(new MyClass("C"));
        list2.add(new MyClass("D"));
        // 根据field字段去重
        List<MyClass> result = Stream.concat(list1.stream(), list2.stream())
                .distinct()
                .collect(Collectors.toList());

        for (MyClass item : result) {
            System.out.println(item.getField());
        }

8.  映射函数

List<String> strings = Arrays.asList("apple", "banana", "cherry");  
List<Integer> lengths = strings.stream()  
    .map(String::length)  
    .collect(Collectors.toList());  
System.out.println(lengths); // 输出 [5, 6, 6]

9. 对元素进行排序

List<String> strings = Arrays.asList("apple", "banana", "cherry", "date");  
List<String> sortedStrings = strings.stream()  
    .sorted((s1, s2) -> Integer.compare(s1.length(), s2.length()))  
    .collect(Collectors.toList());  
System.out.println(sortedStrings); // 输出 [date, apple, cherry, banana]

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值