Stream学习和使用

最近在公司CV习惯了,突然发现自己对函数式编程有点生疏,自己就写点例子,供大家参考学习。建议先别看答案哦,自己想一想。

  • 先给一个PersonThis对象

  • package com.leizhe.learn.lambda1;
    
    /**
     * @author: leizhe
     * @date: 2021/2/2 16:20
     * @description:
     */
    public class PersonThis {
        private String name;  // 姓名
        private int salary; // 薪资
        private int age; // 年龄
        private String sex; //性别
        private String area;  // 地区
        private String salaryString; // 字符串类型的薪资
    
        public PersonThis() {
        }
    
        // 构造方法
        public PersonThis(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;
        }
    
        public PersonThis(String name, int salary, int age, String sex, String area, String salaryString) {
            this.name = name;
            this.salary = salary;
            this.age = age;
            this.sex = sex;
            this.area = area;
            this.salaryString = salaryString;
        }
        // get set 方法省略啦
    }

     

  • 看完上面的对象之后,下面开始提一些问题啦

  • 筛选员工中工资高于8000的人,并形成新的集合

  • 获取员工工资最高的人

  • 按照工资从高到底进行排序

  • 按照工资 选取前三的人员

  • 求平均年龄

  • 求工资最高

  • 求工资之和

  • 同时 求和 最高 最小 平均 个数 (工资)

  • 按照 工资是否大于8000进行分组

  • 根据性别进行分组

  • 先根据 性别 再根据地区分组

  • 按照工资 取前三个的汇总

  • 按照 工资 (字符串字段) 取前三个的工资汇总  

  • 按照工资, 求前三 和 从第四名开始之间的工资之差

  • 字符串按照长度排序

  • 字符串按照获取最长的字符串

  • 将所有人的名字进行拼接成一个字符串

  • 求 每个城市薪资最高的人   ***难度较高***需要看一下JDK1.8 说明文档

  • 排序,先按照工资 desc,再按照年龄asc

  • 除去工资前3 后面的所有工资之和

  • 计算 第3 - 5 工资高之和

  • 下面就是小6写出的答案,欢迎大家在后台提出好问题,以后会追加出来

  • 对于JDK1.8的说明文档,大家可以百度,也可以在后台回复找我要(我也是百度找的O(∩_∩)O哈哈~)

 


package com.leizhe.learn.lambda1;

import com.google.common.base.Function;
import org.apache.logging.log4j.util.PropertySource;
import sun.awt.windows.WWindowPeer;

import java.util.*;
import java.util.function.BinaryOperator;
import java.util.stream.Collector;
import java.util.stream.Collectors;

/**
 * @author: leizhe
 * @date: 2021/1/28 17:17
 * @description:
 */
public class Learn001 {


    public static void main(String[] args) {
        List<PersonThis> list = new ArrayList<PersonThis>();

        list.add(new PersonThis("小张", 7000, 25, "男", "杭州"));
        list.add(new PersonThis("小赵", 7800, 21, "女", "杭州"));
        list.add(new PersonThis("小钱", 8200, 24, "女", "上海"));
        list.add(new PersonThis("小孙", 9500, 25, "男", "上海"));
        list.add(new PersonThis("小李", 8900, 23, "男", "上海"));
        list.add(new PersonThis("小周", 7900, 26, "女", "上海"));
        list.add(new PersonThis("小吴", 7900, 27, "女", "上海"));

        //region 筛选员工中工资高于8000的人,并形成新的集合
        List<String> nameList = list.stream().filter(t -> t.getSalary() > 8000).map(PersonThis::getName).collect(Collectors.toList());
        //endregion
        //region 获取员工工资最高的人
        PersonThis personThis = list.stream().max(Comparator.comparing(PersonThis::getSalary)).get();
        //endregion
        //region 按照工资从高到底进行排序
        list.sort(Comparator.comparing(PersonThis::getSalary).reversed());
        //endregion
        //region 按照工资 选取前三的人员
        List<PersonThis> collect5 = list.stream().sorted(Comparator.comparing(PersonThis::getSalary).reversed()).limit(3).collect(Collectors.toList());
        //endregion
        //region  求平均年龄
        Double collect = list.stream().collect(Collectors.averagingInt(PersonThis::getAge));
        //endregion
        //region 求工资最高
        int salaryMax = list.stream().max(Comparator.comparing(PersonThis::getSalary)).get().getSalary();
        Integer integer = list.stream().map(PersonThis::getSalary).collect(Collectors.maxBy(Integer::compare)).get();

        //endregion
        //region 求工资之和
        Double collect1 = list.stream().collect(Collectors.summingDouble(PersonThis::getSalary));
        double sum = list.stream().mapToDouble(PersonThis::getSalary).sum();
        //endregion
        //region  同时 求和 最高 最小 平均 个数 (工资)
        DoubleSummaryStatistics result = list.stream().collect(Collectors.summarizingDouble(PersonThis::getSalary));
        double sum1 = result.getSum();
        double max = result.getMax();
        double min = result.getMin();
        double average = result.getAverage();
        long count1 = result.getCount();
        //endregion
        //region 按照 工资是否大于8000进行分组
        Map<Boolean, List<PersonThis>> collect2 = list.stream().collect(Collectors.partitioningBy(t -> t.getSalary() > 8000));
        //endregion
        //region 根据性别进行分组
        Map<String, List<PersonThis>> collect3 = list.stream().collect(Collectors.groupingBy(PersonThis::getSex));
        //endregion
        //region 先根据 性别 再根据地区分组
        Map<String, Map<String, List<PersonThis>>> collect4 = list.stream().collect(Collectors.groupingBy(PersonThis::getSex, Collectors.groupingBy(PersonThis::getArea)));
        //endregion
        //region  按照工资 取前三个的汇总
        Double collect6 = list.stream().sorted(Comparator.comparing(PersonThis::getSalary).reversed()).limit(3).collect(Collectors.summingDouble(PersonThis::getSalary));
        double sum2 = list.stream().sorted(Comparator.comparing(PersonThis::getSalary).reversed()).limit(3).mapToDouble(PersonThis::getSalary).sum();
        double sum3 = list.stream().sorted(Comparator.comparing(PersonThis::getSalary).reversed()).limit(3).mapToDouble(t -> t.getSalary()).sum();
        //endregion
        //region 按照 工资 (字符串字段) 取前三个的工资汇总   没算出来
        // Double collect7 = list.stream().sorted(Comparator.comparing(t -> Double.parseDouble(t.getSalaryString())).reversed()).limit(3).collect(Collectors.summingDouble(t -> Double.parseDouble(t.getSalaryString())));
        //endregion
        //region 按照工资, 求前三 和 从第四名开始之间的工资之差

        double sum6 = list.stream().sorted(Comparator.comparing(PersonThis::getSalary).reversed()).limit(3).mapToDouble(PersonThis::getSalary).sum();
        double sum7 = list.stream().sorted(Comparator.comparing(PersonThis::getSalary).reversed()).skip(3).mapToDouble(PersonThis::getSalary).sum();
        double v = sum7 - sum6;
        //endregion
        //region 字符串按照长度排序
        List<String> listStr = Arrays.asList("adnm", "admmt", "pot", "xbangd", "weoujgsd");
        listStr.sort(Comparator.comparing(String::length).reversed());
        //endregion
        //region 字符串按照获取最长的字符串
        String maxStr = listStr.stream().max(Comparator.comparing(String::length)).get();

        //endregion
        //region 将所有人的名字进行拼接成一个字符串
        String collect7 = list.stream().map(PersonThis::getName).collect(Collectors.joining(","));
        //endregion
        //region 求 每个城市薪资最高的人   ***难度较高***需要看一下JDK1.8 说明文档
        // Map<String, Optional<PersonThis>> collect8 = list.stream().collect(Collectors.groupingBy(PersonThis::getArea, Collectors.maxBy(Comparator.comparing(PersonThis::getSalaryString))));

        Map<String, List<PersonThis>> collect10 = list.stream().collect(Collectors.groupingBy(PersonThis::getArea));
        Comparator<PersonThis> salaryComparing = Comparator.comparing(PersonThis::getSalary);
        Map<String, Optional<PersonThis>> collect11 = list.stream().collect(Collectors.groupingBy(PersonThis::getArea, Collectors.reducing(BinaryOperator.maxBy(salaryComparing))));

        //endregion
        //region 排序,先按照工资 desc,再按照年龄asc
        List<PersonThis> collect9 = list.stream().sorted(Comparator.comparing(PersonThis::getSalary).reversed().thenComparing(PersonThis::getAge)).collect(Collectors.toList());
        List<PersonThis> collect8 = list.stream().sorted((t1, t2) -> {
            if (t1.getSalary() == t2.getSalary()) {
                return t1.getAge() - t2.getAge();
            } else {
                return t1.getSalary() - t2.getSalary();
            }
        }).collect(Collectors.toList());
        //endregion
        //region 除去工资前3 后面的所有工资之和
        double sum4 = list.stream().sorted(Comparator.comparing(PersonThis::getSalary).reversed()).skip(3).mapToDouble(PersonThis::getSalary).sum();
        //endregion
        //region 计算 第3 - 5 工资高的之和
        double sum5 = list.stream().sorted(Comparator.comparing(PersonThis::getSalary)).skip(2).limit(3).mapToDouble(PersonThis::getSalary).sum();
        //endregion
        //region  int排序
        List<Integer> listInt = Arrays.asList(3, 6, 1, 9, 4, 7);
        listInt.sort(Comparator.comparing(Integer::intValue));
        listInt.sort(Comparator.comparing(Integer::intValue).reversed());
        //endregion
        //region 计算Integer集合中大于6的元素的个数
        long count = listInt.stream().filter(t -> t > 6).count();
        //endregion
        //region 验证 PersonThis::getSalary
        Function<PersonThis, Integer> getSalary = PersonThis::getSalary;
        //endregion
        System.out.println("//the end");
    }
}

欢迎大家关注菜鸟小6

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值