jdk1.8 的Stream操作使用

本文深入探讨Java Stream API的各种操作,包括筛选与切片、映射、排序、匹配与查找、映射和规约以及收集等,通过实例展示如何处理集合数据,提高编程效率。

1 //筛选与切片 filter:过滤出符合条件的元素 limit:使其元素不超过一定值。 skip:跳过前面一定数量的元素 distinct :去除重复数据,要重写hashcode和equals方法
2 //映射 map :根据规则将元素a 转变成要的 元素b
3 //排序 sorted() sorted(Comparator<? super T> comparator);
4 //终止操作 1.匹配与查找 //allMatch 检查元素是否都符合条件 //anyMatch 是否有符合条件的 //noneMatch 是否有不符合条件的 //最大,和最小 max min 内部遍历 forEach
5 //映射和规约 map reduce 规约相当于总合 把所有的元素进行总合
6 //终止 1 收集 Collectors

package com.wkb.springmybatis.controller;

import org.junit.Test;

import java.util.Arrays;
import java.util.List;
import java.util.Optional;
import java.util.function.Predicate;
import java.util.function.ToDoubleFunction;
import java.util.stream.Collectors;
import java.util.stream.Stream;

public class StreamTest {

    @Test
    public void  test1(){
        Stream<Employee> stream = EmployeeData.getEmployeeData().stream();
        Stream<Employee> employeeStream = EmployeeData.getEmployeeData().parallelStream();

    }

    //筛选与切片  filter:过滤出符合条件的元素    limit:使其元素不超过一定值。    skip:跳过前面一定数量的元素   distinct :去除重复数据,要重写hashcode和equals方法
    @Test
    public void  test2(){
        List<Employee> employeeData = EmployeeData.getEmployeeData();
        Stream<Employee> stream = employeeData.stream();
//        Stream<Employee> employeeStream = EmployeeData.getEmployeeData().parallelStream();
        //过滤age>30
//        stream.filter(employee -> employee.getAge()>30).forEach(System.out::println);
        //过滤name   模糊查询
//        stream.filter(employee -> employee.getName().matches("^(.*马.*)$")).forEach(System.out::println);
        String name = "马";
        stream.filter(employee -> employee.getName().matches("^(.*"+name+".*)$")).forEach(System.out::println);

        System.out.println("-----------------");
        employeeData.stream().limit(3).forEach(System.out::println);
        System.out.println("-----------------");
        employeeData.stream().skip(3).forEach(System.out::println);


        System.out.println("-----------------");
        employeeData.add(new  Employee(1001,"马化腾",34,6000.78));
        employeeData.add(new  Employee(1001,"马化腾",34,6000.78));
        employeeData.stream().forEach(System.out::println);
        System.out.println("-----------------");
        employeeData.stream().distinct().forEach(System.out::println);

    }



    //映射    map :根据规则将元素a 转变成要的 元素b
    @Test
    public void test3(){
        //1 map使用:  获取员工姓名长度大于3的员工姓名
        List<Employee> employeeData = EmployeeData.getEmployeeData();
        //map先获取姓名,filter过滤
        employeeData.stream().map(Employee::getName).filter(str->str.length()>3).forEach(System.out::println);

        //2 flatMap 传入的就是Stream<T> :   map可能会Stream<Stream<String>>   ,使用flatMap则 生成Stream<String>   flatMap和Map的区别有点像List.add()  和 List.addAll()的区别
//        Stream<R> rStream = employeeData.stream().flatMap(Employee::getName);

    }
    //排序  sorted()   sorted(Comparator<? super T> comparator);
    @Test
    public void test4(){
        List<Employee> employeeData = EmployeeData.getEmployeeData();
        // 1 Employee需要实现  Comparable
        employeeData.stream().sorted().forEach(System.out::println);
        System.out.println("---------------");
        // 2  传Comparator实现方法
        employeeData.stream().sorted((e1,e2)->{return  Double.compare(e1.getSalary(),e2.getSalary());}).forEach(System.out::println);

    }



    //终止操作   1.匹配与查找   //allMatch 检查元素是否都符合条件  //anyMatch  是否有符合条件的   //noneMatch   是否有不符合条件的   //最大,和最小  max  min  内部遍历  forEach
    @Test
    public void test5(){
        List<Employee> employeeData = EmployeeData.getEmployeeData();
        //1. 匹配与查找
        //allMatch 检查元素是否都符合条件
        boolean b = employeeData.stream().allMatch(e -> e.getAge() > 20);
        System.out.println(b);
        System.out.println("---------------");
        //anyMatch  是否有符合条件的
        System.out.println(employeeData.stream().anyMatch(e->e.getSalary()>2000));
        System.out.println("---------------");
        //noneMatch   是否有不符合条件的
        System.out.println(employeeData.stream().noneMatch(e->e.getSalary()>2000));
        System.out.println("---------------");
        System.out.println(employeeData.stream().count());
        System.out.println("---------------");
        System.out.println(employeeData.stream().findAny());
        System.out.println("---------------");
        System.out.println(employeeData.stream().findFirst());
        System.out.println("---------------");

        System.out.println("---------------");
        //最大,和最小  max  min
////        System.out.println(employeeData.stream().max(e->e.getSalary().intValue()));;
        System.out.println(employeeData.stream().min((e1,e2)->{return  Double.compare(e1.getSalary(),e2.getSalary());}));


//        employeeData.stream().peek();

    }


    //映射和规约   map reduce   规约相当于总合 把所有的元素进行总合
    @Test
    public void test6(){
//        计算1-10的和
        List<Integer> integers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
        Integer reduce = integers.stream().reduce(0, Integer::sum);
        System.out.println(reduce);

        //计算公司员工的所有工资总合
        List<Employee> employeeData = EmployeeData.getEmployeeData();
        Optional<Double> reduce1 = employeeData.stream().map(e -> e.getSalary()).reduce((e1, e2) -> e1 + e2);
        System.out.println(reduce1.get());

    }

    //终止   1 收集  Collectors
    @Test
    public void test7(){
        List<Employee> employeeData = EmployeeData.getEmployeeData();
         employeeData.stream().filter(e -> e.getSalary() > 5000).collect(Collectors.toList()).forEach(System.out::println);
        System.out.println();
         employeeData.stream().filter(e -> e.getSalary() > 5000).collect(Collectors.toSet()).forEach(System.out::println);

         employeeData.stream().filter(new Predicate(){

             @Override
             public boolean test(Object o) {
                 return false;
             }
         });
        System.out.println();
        Double collect = employeeData.stream().filter(e -> e.getSalary() > 5000).collect(Collectors.averagingDouble(e -> e.getSalary()));
        Double collec1t = employeeData.stream().filter(e -> e.getSalary() > 5000).collect(Collectors.averagingDouble(new ToDoubleFunction<Employee>() {
            @Override
            public double applyAsDouble(Employee value) {
                return value.getAge();
            }
        } ));
        System.out.println(collect);
        System.out.println(collec1t);



    }

}

JDK 1.8 中的 Stream API 是一种用于处理集合数据的强大工具,它支持函数式编程风格,并且可以简化对集合的复杂操作Stream API 的设计使得数据处理更加直观、简洁,同时也提高了代码的可读性和可维护性。以下是 Stream API 的主要使用场景: ### 数据过滤与筛选 Stream API 提供了 `filter` 方法,可以根据指定的条件对集合中的元素进行筛选。这种操作在处理大量数据时非常高效,尤其是在需要根据某些规则从集合中提取子集的情况下[^2]。 例如,从一个 `Person` 对象列表中筛选出年龄大于 25 岁的人: ```java List<Person> filteredPeople = people.stream() .filter(p -> p.getAge() > 25) .collect(Collectors.toList()); ``` ### 数据映射与转换 通过 `map` 方法,Stream API 可以将集合中的每个元素按照某种方式转换为另一个对象。这种转换在处理数据时非常常见,例如将一个字符串列表转换为它们的长度列表,或者将一组对象转换为另一组对象[^3]。 ```java List<Integer> lengths = strings.stream() .map(String::length) .collect(Collectors.toList()); ``` ### 数据聚合 Stream API 支持多种聚合操作,如 `count`、`max`、`min` 和 `sum`,这些操作可以用于计算集合中元素的统计信息。这些方法通常用于数据分析和报告生成[^2]。 ```java long count = numbers.stream().count(); Optional<Integer> max = numbers.stream().max(Integer::compare); ``` ### 分组与分区 `Collectors.groupingBy` 和 `Collectors.partitioningBy` 是 Stream API 中非常强大的功能,可以按照某个属性对数据进行分组或分区。这种操作在需要根据某个字段对数据进行分类时非常有用[^5]。 例如,按年龄对 `Person` 对象进行分组: ```java Map<Integer, List<Person>> groupedByAge = people.stream() .collect(Collectors.groupingBy(Person::getAge)); ``` ### 并行处理 Stream API 支持串行和并行两种模式进行汇聚操作,并发模式能够充分利用多核处理器的优势,使用 fork/join 并行方式来拆分任务和加速处理过程。这种模式在处理大规模数据集时可以显著提高性能[^2]。 ```java int sum = numbers.parallelStream() .mapToInt(Integer::intValue) .sum(); ``` ### 遍历与消费 Stream API 提供了 `forEach` 方法,可以用于遍历流中的每个元素并执行某个操作。这种方法通常用于执行副作用操作,如打印日志或更新外部状态[^4]。 ```java people.stream() .forEach(p -> System.out.println(p.getName())); ``` ### 数据排序 Stream API 提供了 `sorted` 方法,可以对流中的元素进行排序。这种操作在需要对数据进行排序时非常方便,尤其是在需要根据多个字段进行排序的情况下[^2]。 ```java List<Person> sortedPeople = people.stream() .sorted(Comparator.comparing(Person::getAge)) .collect(Collectors.toList()); ``` ### 数据缩减 `reduce` 方法允许将流中的元素组合成一个单一的结果,例如求和、求积或拼接字符串。这种操作在需要将多个值合并为一个值时非常有用。 ```java Optional<String> concatenatedNames = people.stream() .map(Person::getName) .reduce((name1, name2) -> name1 + ", " + name2); ``` ### 集合操作 Stream API 还支持集合操作,如 `distinct`、`limit` 和 `skip`,这些操作可以用于去重、截取或跳过某些元素。这些方法在需要处理集合的子集时非常有用。 ```java List<String> uniqueNames = people.stream() .map(Person::getName) .distinct() .collect(Collectors.toList()); ``` ### 相关问题 1. 如何在 Java 8使用 Stream API 进行数据过滤? 2. Stream API 中的 `map` 方法有哪些常见的使用场景? 3. 如何利用 Stream API 对数据进行分组和分区? 4. Stream API 如何支持并行处理以提高性能? 5. Stream API 中的 `reduce` 方法有哪些实际应用?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值