Java8 Stream用法大全

使用到的实体类

实体类1

public class Person {
    private String name;  // 姓名
    private int salary; // 薪资
    private int age; // 年龄
    private String sex; //性别
    private String area;  // 地区

    public String getName() {
        return name;
    }

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

    public int getSalary() {
        return salary;
    }

    public void setSalary(int salary) {
        this.salary = salary;
    }

    public int getAge() {
        return age;
    }

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

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    public String getArea() {
        return area;
    }

    public void setArea(String area) {
        this.area = area;
    }

    public Person(String name, int salary, int age, String sex, String area) {
        this.name = name;
        this.salary = salary;
        this.age = age;
        this.sex = sex;
        this.area = area;
    }

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", salary=" + salary +
                ", age=" + age +
                ", sex='" + sex + '\'' +
                ", area='" + area + '\'' +
                '}';
    }
}

实体类2

public class PersonDto {
    private String name;  // 姓名
    private int salary; // 薪资
    private int age; // 年龄

    public String getName() {
        return name;
    }

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

    public int getSalary() {
        return salary;
    }

    public void setSalary(int salary) {
        this.salary = salary;
    }

    public int getAge() {
        return age;
    }

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

    public PersonDto(String name, int salary, int age) {
        this.name = name;
        this.salary = salary;
        this.age = age;
    }

    @Override
    public String toString() {
        return "PersonDto{" +
                "name='" + name + '\'' +
                ", salary=" + salary +
                ", age=" + age +
                '}';
    }
}

创建一个集合

  public static List<Person> getPersonList() {
        List<Person> personList = new ArrayList<Person>();
        personList.add(new Person("Tom", 8900, 18, "male", "New York"));
        personList.add(new Person("Jack", 7000, 19, "male", "Washington"));
        personList.add(new Person("Lily", 7800, 20, "female", "Washington"));
        personList.add(new Person("Anni", 8200, 38, "female", "New York"));
        personList.add(new Person("Owen", 9500, 58, "male", "New York"));
        personList.add(new Person("Alisa", 7900, 38, "female", "New York"));
        personList.add(new Person("Alisa", 7900, 38, null, "New York"));
        return personList;
    }

foreach使用

  public static void main(String[] args) {
        List<Person> personList = getPersonList();
        //foreach使用
        //给每个人工资+1000
        personList.stream().forEach(s -> s.setSalary(s.getSalary() + 1000));

}

filter使用

  public static void main(String[] args) {
        List<Person> personList = getPersonList();
       // 查询工资大于8000,且性别为男性的员工
        List<Person> personList1 = personList.stream().filter(s -> s.getSalary() > 8000 && "male".equals(s.getSex())).toList();
        System.out.println(personList1);
        // 查询工资大于8000满足条件的第一个元素
        Person person = personList.stream().filter(s -> s.getSalary() > 8000).findFirst().orElse(null);
        System.out.println(person);
        // 查询工资大于8000满足条件的最后一个元素
        Person person1 = personList.stream().filter(s -> s.getSalary() > 8000).skip(personList.size() - 1).findFirst().orElse(null);

}

映射(map)

  public static void main(String[] args) {
        List<Person> personList = getPersonList();
  		//获取其中一个字段,组成新的集合
        List<String> nameList = personList.stream().map(Person::getName).toList();
         //获取其中一个字段,并添加前缀组成新的集合
        List<String> newNameList = personList.stream().map(s->"RRR"+s.getName()).toList();
        //转换成新的对象
        List<PersonDto> personList2 = personList.stream().map(s -> {
            return new PersonDto(s.getName(), s.getSalary(), s.getAge());
        }).collect(Collectors.toList());
        System.out.println("转换成新的对象==" + personList2);

}

聚合(max/min/count)

  public static void main(String[] args) {
        List<Person> personList = getPersonList();
  		//获取集合中年龄的最大值
        Integer maxAge = personList.stream().map(Person::getAge).max(Comparator.comparing(Integer::valueOf)).orElse(null);
        System.out.println("年龄的最大值===" + maxAge);
        Integer maxAge2 = personList.stream().map(Person::getAge).reduce(Integer::max).get();
        System.out.println("年龄的最大值====方式2===" + maxAge2);

        //获取集合中年龄的最小值
        Integer minAge = personList.stream().map(Person::getAge).min(Comparator.comparing(Integer::valueOf)).orElse(null);
        System.out.println("年龄的最小值===" + minAge);
        Integer minAge2 = personList.stream().map(Person::getAge).reduce(Integer::min).get();
        System.out.println("年龄的最小值====方式2===" + minAge2);

        //获取集合中工资总和
        Integer sumSalary = personList.stream().map(Person::getSalary).reduce(0, Integer::sum);
        System.out.println("获取集合中工资总和===" + sumSalary);
        //获取集合中工资总和
        Integer sumSalary2 = personList.stream().map(Person::getSalary).mapToInt(Integer::valueOf).sum();
        System.out.println("获取集合中工资总和=====方式2 ===" + sumSalary2);

        //获取集合中工资的平均值,并设置3为小数
        Double avgSalary = personList.stream().mapToDouble(Person::getSalary).average().orElse(0);
        System.out.println("获取集合中工资总和===" + avgSalary);
        //获取集合中工资大于8000的人数
        long count = personList.stream().filter(s -> s.getSalary() > 8000).count();
        System.out.println("获取集合中工资大于8000的人数===" + count);
}

collect使用

  public static void main(String[] args) {
        List<Person> personList = getPersonList();
   		//获取其中一个字段,组成新的List集合
        List<String> namesList = personList.stream().map(Person::getName).collect(Collectors.toList());
        //获取其中一个字段,组成新的set集合
        Set<String> namesSet = personList.stream().map(Person::getName).collect(Collectors.toSet());

        //按照性别分组,每组按照工资排序取工资最高的一条
        Map<String, Person> highestSalaryBySex = personList.stream()
                .collect(Collectors.groupingBy(s-> Optional.ofNullable(s.getSex()).orElse(""),
                        Collectors.maxBy(Comparator.comparing(Person::getSalary))))
                .entrySet().stream()
                .collect(Collectors.toMap(Map.Entry::getKey, e -> e.getValue().orElse(null)));
        System.out.println(highestSalaryBySex);

}

排序使用(sorted)

  public static void main(String[] args) {
        List<Person> personList = getPersonList();
   		  // 排序使用(sorted)
        List<Integer> list = personList.stream().map(Person::getAge).collect(Collectors.toList());
        // 正序
        list.sort(Integer::compareTo);
        // 倒叙
        list.sort(Comparator.reverseOrder());
        // 正序
        list.sort(Comparator.naturalOrder());
       //对personList先按照年龄排序,再按照工资排序降序排序
        List<Person> sortPersonList = personList.stream().sorted(Comparator.comparing(Person::getAge).
                thenComparing(Person::getSalary, Comparator.reverseOrder())).collect(Collectors.toList());
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值