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

 

用_Excel_制作漂亮的工资条的方法.doc 用 Excel 制作漂亮的工资条的方法   如何使用Excel进行工资条的制作,也许有些网友使用已经很长时间了,但如何更快更好的做出漂亮的工资条,看看作者的方法吧。   “小问题难倒老财务”,也许你已经在财务口上工作多年,也许你天天都要面对Excel那张老脸,也许你已经习惯了用工资明细表做员工工资统计并向上级汇报,把表中的条目一条条复制粘贴后打印发给每个员工。可你是否想过,找一个更简单更有效率的方法?看起来这似乎有些困难:在工资明细表中,工资的项目(即表头)一般只出现在表格开头的某一行,而在工资条中,为了便于阅读则要求每个人的工资都有表头,那么如何巧妙地把工资明细表制作成便于打印的工资条呢?如图所示,这就是我们要完成的工作(原工资表见图1,转换成工资条后的效果见图2): 图1 原工资表 图2 转换后效果   “条条大路通罗马”,不过路有远近之分,方法也有难易之别,这里给大家提供三种最简单易用的方法。   方法一:宏命令控制法   对于Office家族的宏功能,大家或许早有耳闻,但由于需要使用VBA进行编程,所以宏一直让许多人望而却步,不过要使用一个现成的宏就简单多了。首先打开要处理的Excel表,选择“工具→宏→Visual Basic 编辑器”,在编辑器左边的窗口中用鼠标双击Sheet1,会出现代码编辑窗口,在代码编辑窗口输入如下代码(为了不破坏原有的工资表,所以这里采用了将 Sheet1的内容复制到Sheet2的方法,所以最后的生成结果是在Sheet2中显示):   Sub MakeSalaryList()   Dim i As Integer   Dim endrow As Integer   '测出数据的最后一行   endrow = Sheet1.Range("a65536").End(xlUp).Row - 1   '把标题贴过去   Worksheets(1).Range("1:1").Copy (Worksheets(2).Cells(1, 1))   For i = 3 To endrow   '把每条数据抬头贴过去   Worksheets(1).Range("2:2").Copy (Worksheets(2).Cells(3 * i - 7, 1))   '把数据贴过去   Worksheets(1).Range(Cells(i, 1), Cells(i, 256)).Copy (Worksheets(2).Cells(3 * i - 6, 1))   Next i   End Sub   关闭编辑器,将自动返回到刚才的Excel表,选择“工具→宏→宏”,将弹出如下对话框:(见图3) 方法二:公式填充法   相比宏命令,公式填充法更便于理解,不过需要手工操作的步骤稍微多一些,“鱼和熊掌不可得兼”,要用哪种方法就看你的爱好了。   首先打开要操作的Excel工资表,为了不破坏原表(Sheet1)结构,我们仍然采用在Sheet2中进行操作的方法。由于这个工资表一共有L列,18行,要复制的
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值