Java8常用之Stream API简单Demo演示

package com.company.bsearch.jdk8;

/**
 * @author huoziyang
 * @version 1.0
 * @date 2021/6/15 10:47
 */
public class User {

    private int id;
    private String name;
    private int age;
    private Double height;

    public User(int id, String name, int age, Double height) {
        this.id = id;
        this.name = name;
        this.age = age;
        this.height = height;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public Double getHeight() {
        return height;
    }

    public void setHeight(Double height) {
        this.height = height;
    }
}

package com.company.bsearch.jdk8;

import java.util.*;
import java.util.stream.Collectors;

/**
 * @author huoziyang
 * @version 1.0
 * @date 2021/6/15 10:49
 */
public class StreamApiDemo {

    public static void main(String[] args) {

        List<User> users = Arrays.asList(new User(1, "zhangsan", 38, 172.5),
                new User(2, "lisi", 38, 180.0),
                new User(3, "wangwu", 25, 185.0),
                new User(4, "maliu", 25, 180.0),
                new User(5, "zhouwu", 30, 170.0));

        System.out.println("------------------filter操作-----------------------------------------");
        // 筛选出年龄大于18岁的人
        List<User> ageBigThan18 = users.stream().filter(user -> user.getAge() > 18).collect(Collectors.toList());
        ageBigThan18.forEach(System.out::println);

        // 筛选出年龄大于18且身高高于170的人
        users.stream().filter(user -> user.getAge() > 18).filter(user -> user.getHeight() > 170).forEach(System.out::println);

        // 筛选出年龄等于18且身高大于180的人
        users.stream().filter(user -> user.getAge() == 18).filter(user -> user.getHeight() > 180).forEach(System.out::println);

        System.out.println("------------------sorted操作-----------------------------------------");

        users.forEach(System.out::println);
        // 按照身高逆序排序
        users.stream().sorted(Comparator.comparingDouble(User::getAge).reversed()).collect(Collectors.toList()).forEach(System.out::println);
        // 先按年龄排序,然后按照身高排序
        users.stream().sorted(Comparator.comparingInt(User::getAge).thenComparingDouble(User::getHeight)).collect(Collectors.toList()).forEach(System.out::println);

        System.out.println("-----------------------map操作------------------------------------");
        // 取最大值、最小值等操作:max,min,sum
        int maxAge = users.stream().mapToInt(User::getAge).max().getAsInt();
        User maxAgeUser = users.stream().max(Comparator.comparingInt(User::getAge)).get();

        // 找到年龄大于25岁的所有人的名字,并将所有人按照年龄排序
        users.stream().filter(user -> user.getAge() > 25).
                sorted(Comparator.comparingInt(User::getAge))
                .map(User::getName)
                .collect(Collectors.toList()).
                forEach(System.out::println);

// 找到年龄大于25岁的所有人的身高,并将所有人分别按照身高、年龄排序
        // 此时只能先排序然后在使用map拿到对应的人的身高,不然先拿到人的身高的集合再去排序,此时集合只有身高,变不能进行排序
        users.stream().filter(user -> user.getAge() > 25).sorted(Comparator.comparingInt(User::getAge)
                .thenComparingDouble(User::getHeight)).map(User::getHeight).collect(Collectors.toList()).forEach(System.out::println);

        System.out.println("-----------------------8888888888------------------------------------");

        users.stream().limit(2).collect(Collectors.toList()).forEach(System.out::println);
        System.out.println("-----------------------999999999------------------------------------");

        users.stream().skip(2).collect(Collectors.toList()).forEach(System.out::println);
        // 还有distinct操作,这里不方便演示
        System.out.println("-----------------------101010101010------------------------------------");

        users.stream().map(User::getAge).forEach(System.out::println);
        System.out.println("-----------------------111111111111111------------------------------------");

        System.out.println("-----------------------查找和匹配allMatch、 anyMatch、 noneMatch、 findFirst和findAny------------------------------------");

        // //判断集合中是否有任何符合条件的元素 终端操作返回boolean
        boolean b = users.stream().anyMatch(user -> user.getAge() > 100);
        System.out.println(b);
        System.out.println(users.stream().allMatch(user -> user.getAge() > 20));
        System.out.println(users.stream().noneMatch(user -> user.getAge() > 100));
        //你可能会想,为什么会同时有findFirst和findAny呢?答案是并行。找到第一个元素
        // 在并行上限制更多。如果你不关心返回的元素是哪个,请使用findAny,因为它在使用并行流
        //  时限制较少。
        System.out.println(users.stream().filter(user -> user.getAge() > 25).findAny());
        System.out.println(users.stream().filter(user -> user.getAge() > 25).findFirst());

        System.out.println("------------规约reduce----------------");

        /*
            规约的使用规则:从第一个参数开始参加计算
         */

        List<Integer> integers = Arrays.asList(2, 0, 4, 5, 3, 1);
        Integer reduce = integers.stream().reduce(0, Integer::sum);
        System.out.println(reduce);
        System.out.println(integers.stream().reduce(-10, Integer::sum));
        System.out.println(integers.stream().reduce(11, Integer::compareTo));


        // 求最大值最小值
        System.out.println(integers.stream().reduce(Integer::max).get());
        System.out.println(integers.stream().reduce(Integer::min).get());
        System.out.println(integers.stream().reduce((a, b1) -> a < b1 ?a : b1).get());

        // 对基本数据类型进行装箱boxed
        integers.stream().mapToInt(i -> i * 2).boxed().collect(Collectors.toList()).forEach(System.out::println);

        // 求users中身高的个数
        System.out.println("求users中身高的个数: "+users.stream().map(h -> 1).reduce(Integer::sum).get());
        // 对所有的人员的id求和
        System.out.println("对所有的人员的id求和: "+ users.parallelStream().map(User::getId).reduce(0, Integer::sum));

        System.out.println("--------------------groupBy按照某个属性进行分组----------------");

        // 按照年龄分组
        System.out.println("按照年龄分组: "+users.stream().collect(Collectors.groupingBy(User::getAge)));

        Map<Integer, Double> collect = users.stream().collect(Collectors.groupingBy(User::getAge, Collectors.averagingDouble(User::getHeight)));
        collect.forEach((k, v) -> System.out.println("key:" + k + ", value:" + v));

        // 按照年龄分组,求该组中人员的id之和
        Map<Integer, Integer> collect1 = users.stream().collect(Collectors.groupingBy(User::getAge, Collectors.summingInt(User::getId)));
        collect1.forEach((k, v) -> System.out.println("key:" + k + ", value:" + v));


        // 按照 年龄分组,求该组中的数据个数
        Map<Integer, Long> collect2 = users.stream().collect(Collectors.groupingBy(User::getAge, Collectors.counting()));
        collect2.forEach((k, v) -> System.out.println("key:" + k + ", value:" + v));


        List<Integer> list = new ArrayList<>();
        list.add(1);
        Optional.ofNullable(list).map(l -> l.get(0)).orElseGet(() -> 1);
        Optional.of(list).isPresent();
    }
}



posted @ 2021-06-15 15:59  hochan_100  阅读(30)  评论(0编辑  收藏  举报