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

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
项目想实现excel图表但POI不支持所以想到了这个方法。放上来抛砖引玉,感兴趣的欢迎大家交流 注:-------------------------------------------------------------------------- 其实现原理和利用JavaScript实现客户端绘图完全一样。后台代码将输入 写入特定区域,前端脚本在页面载入时执行脚本绘图。大家都是做B/S开发 的,这方面的只是不需要我多说了吧。 如果我们让一个HTML页面在载入时显示一个提示框用后台编程是不现实的 所以我们就动态生成一段JS: window.onload=function(){ ...... } 用Java输出图表的场景和这个一样,POI、JXL对操作Excel图表无能为力 但Excel支持脚本的,也有工作表载入事件,所以也可以用同样的原理实现 只不过这次客户端不再是浏览器而是Excel应用程序。 这样交代的应该比较明白了吧,请不要再留言抱怨没有Java代码了,因为 这根本跟java代码没多大关系,后台的代码所做的工作仅仅是写入必要的 数据,数据的解析和绘图操作是在VBA完成的 ---2009-12-18 今天查找资料翻出来了这段代码,发现里边的类确实是空的,我说怎么总挨骂 呢,当时肯定打包的时候晕透了把另一个本该删除的类打包进去了。我无法 替换文件只能把java代码贴上来了,请自己修改模板文件的路径。 package com.test.poi; import java.io.FileInputStream; import java.io.FileOutputStream; import org.apache.poi.hssf.usermodel.HSSFRow; import org.apache.poi.hssf.usermodel.HSSFSheet; import org.apache.poi.hssf.usermodel.HSSFWorkbook; import org.apache.poi.poifs.filesystem.POIFSFileSystem; public class PoiChart { public static void main(String[] args){ try{ POIFSFileSystem fs=new POIFSFileSystem(new FileInputStream("E:/王建波_bak/我的练习/Module.xls")); HSSFWorkbook wb=new HSSFWorkbook(fs); HSSFSheet sheet=wb.getSheetAt(0); HSSFRow row; //写入表头 String[] aTblHeaders=new String[]{ "姓名","语文","数学","英语" }; row=sheet.createRow(0); for(int i=0,len=aTblHeaders.length;i<len;i++){ row.createCell((short)i).setCellValue(aTblHeaders[i]); } //向模板写入数据 String[] aNames=new String[]{ "张飞","刘备","关羽","曹操","孙权","吕布" }; for(int i=0,nRowLen=aNames.length;i<nRowLen;i++){ row=sheet.createRow(i+1); row.createCell((short)0).setCellValue(aNames[i]); for(int j=1,nColLen=aTblHeaders.length;j<nColLen;j++){ row.createCell((short)j).setCellValue(Math.floor(Math.random()*100)); } } //输出文件 FileOutputStream fout=new FileOutputStream("d:/chart.xls"); wb.write(fout); fout.close(); }catch(Exception e){ e.printStackTrace(); } } }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值