java8 Stream-API 最全详细解析

作者:gaoqiang 时间:23-03-12 阅读数:115人阅读

dvccbvx51210vvc1.png

1. 筛选与切片(filter,limit,skip,distinct)
filter(Predicate<? super T> predicate)

limit(long maxSize)

skip(long n)

distinct()

static List<Employee> employees = Arrays.asList(
        new Employee("张三",18,9999.99),
        new Employee("李四",58,5555.55),
        new Employee("王五",26,3333.33),
        new Employee("赵六",36, 6666.66),
        new Employee("田七",12, 8888.88),
        new Employee("田七",12, 8888.88));
public static void main(String[] args) {
        /*
        1. 筛选与切片
        filter-接收 Lambda ,从流中排除某些元素。必须有终止操作,要不然没有任何结果返回
        limit-截断流,使其元素不超过给定数量。
        skip(n)一 跳过元素,返回一个扔掉了前 n 个元素的流。若流中元素不足 n 个,则返回一个空流。与 limit(n) 互补
        distinct-筛选,通过流所生成素的 hashCode() 和 equals() 去除重复元素
        */
        //过滤年龄大于20岁的
        employees.stream().filter(e-> e.sex > 20).forEach(System.out::println);
        //取结果前3条
        employees.stream().limit(3).forEach(System.out::println);
        //跳过前3个元素
        employees.stream().skip(3).forEach(System.out::println);
        //去除重复元素
        employees.stream().distinct().forEach(System.out::println);
        //以上操作可以多个组合搭配
        employees.stream()
            .filter(e-> e.getSalary() >6000)
            .skip(1)
            .distinct()
            .forEach(System.out::println);
    }

2. 映射(map,flatMap)
map(Function<? super T, ? extends R> mapper)

flatMap(Function<? super T, ? extends Stream<? extends R>> mapper)

        /*
        映射
        map 接收 Lambda ,将元素转换成其他形式或提取信息。接收一个函数作为参数,该函数会被应用到每个元素上,并将其映射成一个新的元素。
        flatMap 接收一个函数作为参数,将流中的每个值都换成另一个流,然后把所有流连接成一个流
        */
        //元素转换
        List<String> list = Arrays.asList("aaa", "bbb", "ccc", "ddd", "eee");
        list.stream().map(String::toUpperCase).forEach(System.out::println);
        //信息提取
        employees.stream().map(Employee::getName).forEach(System.out::println);

3. 排序(sorted)
sorted()自然排序 --Comparable

sorted(Comparator com)- 定制排序

       /*排序
        sorted()自然排序  --Comparable
        sorted(Comparator com)- 定制排序
        */
        List<String> list1 = Arrays.asList("aaa", "ddd", "fff", "ccc", "bbb");
        list1.stream().sorted().forEach(System.out::println);
        //定制排序
        employees.stream()
            .sorted((e1, e2) -> {
                if (e1.getAge().equals(e2.getAge())) {
                    return (int) (e1.getSalary() -(e2.getSalary()));
                }else {
                    return e1.getAge().compareTo(e2.getAge());
                }
            }).forEach(System.out::println);

4. 查找与匹配(allMatch,anyMatch,noneMatch,findFirst,count,max,min)

/*
查找与匹配
allMatch-检查是否匹配所有元素
anyMatch一检查是否至少匹配一个元素
noneMatch-检查是否没有匹配所有元素
findFirst--返回第一个元素
findAny-返回当前流中的任意元素
count--返回流中元素的总个数
max一返回流中最大值
min-一返回流中最小值
*/
// 判断是否全为男,是则为true,否则为false
        boolean match = employees.stream().allMatch(e -> "男".equals(e.getSex()));
        System.out.println(match);
        //只要有一个元素匹配就为true,否则为false
        boolean anyMatch = employees.stream().anyMatch(e -> e.getAge() == 26);
        System.out.println(anyMatch);
        //只要元素不匹配就为true
        boolean noneMatch = employees.stream().noneMatch(e -> "张si".equals(e.getName()));
        System.out.println(noneMatch);

        //取第一个
        Employee employee = employees.stream().findFirst().get();
        System.out.println(employee);

        //取任意元素
        Employee employee1 = employees.stream().findAny().get();

        // 流中元素个数
        long count = employees.stream().count();
        System.out.println(count);
        //取最大值和最小值
        double max = employees.stream().max(Comparator.comparingDouble(Employee::getSalary)).get().getSalary();
        double min = employees.stream().min(Comparator.comparingDouble(Employee::getSalary)).get().getSalary();
        employees.stream().map(Employee::getSalary).max(Double::compareTo).get();
        System.out.println(max);
        System.out.println(min);

5.归约(reduce)

//        归约
//        reduce(T identity, Binary0perator) / reduce(BinaryOperator) 一可以将流中元素反复结合起来,得到一个值。
        List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9);
        Integer reduce = list.stream().reduce(0, Integer::sum);
        System.out.println(reduce);

        Double aDouble = employees.stream().map(Employee::getSalary).reduce(Double::sum).get();
        System.out.println(aDouble);

6. 收集(collect )

//        收集
//        collect 将流转换为其他形式。接收一个 Collector接口的实现,用于给Stream中元素做汇总的方法
// 如List,Set,Map
//将元素提取出了再组装为新的List集合
List<String> collect = employees.stream().map(Employee::getName).collect(Collectors.toList());
Set<String> set = employees.stream().map(Employee::getName).collect(Collectors.toSet());
HashSet<String> set1 = employees.stream().map(Employee::getName).collect(Collectors.toCollection(HashSet::new));
//计算工资平均值
Double aDouble = employees.stream().collect(Collectors.averagingDouble(Employee::getSalary));
//分组
Map<String, List<Employee>> map = employees.stream().collect(Collectors.groupingBy(Employee::getSex));
//分区
Map<Boolean, List<Employee>> listMap = employees.stream().collect(Collectors.partitioningBy((e) -> e.getSalary() > 6000));

DoubleSummaryStatistics dss = employees.stream().collect(Collectors.summarizingDouble(Employee::getSalary));
System.out.println(dss.getSum());
System.out.println(dss.getAverage());
System.out.println(dss.getMax());

//字符串拼接
String s = employees.stream().map(Employee::getName).collect(Collectors.joining(","));

7. 并行流与串行流
并行流就是把一个内容分成多个数据块,并用不同的线程分别处理每个数据块的流。

Java 8 中将并行进行了优化,我们可以很容易的对数据进行并行操作。Stream API 可以声明性地通过 parallel()与sequential()在并行流与顺序流之间进行切换。

本文链接:https://www.518wz.top/post/27.html 转载需授权!

分享到:

发表评论