Javaheima13
Java
Stream流
salary 薪水
bonus 奖金
top performer 优秀员工
punish 处罚
1员工信息至少包含了(名称、性别、工资、奖金、处罚记录)
2开发一部有4个员工、开发二部有5名员工
3分别筛选出2个部门的最高工资的员工信息,封装成优秀员工对象Topperformer
4分别统计出2个部门的平均月收入,要求去掉最高和最低工资。
5统计2个开发部门整体的平均工资,去掉最低和最高工资的平均值。
package com.yu.Day0604Demo;
public class Employee {
    private String name;
    private char sex;
    private double salary;
    private double bonus;
    private String punish;
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public char getSex() {
        return sex;
    }
    public void setSex(char sex) {
        this.sex = sex;
    }
    public double getSalary() {
        return salary;
    }
    public void setSalary(double salary) {
        this.salary = salary;
    }
    public double getBonus() {
        return bonus;
    }
    public void setBonus(double bonus) {
        this.bonus = bonus;
    }
    public String getPunish() {
        return punish;
    }
    public void setPunish(String punish) {
        this.punish = punish;
    }
    @Override
    public String toString() {
        return "topperformer{" +
                "name='" + name + '\'' +
                ", sex=" + sex +
                ", salary=" + salary +
                ", bonus=" + bonus +
                ", punish='" + punish + '\'' +
                '}';
    }
    public Employee() {
    }
    public Employee(String name, char sex, double salary, double bonus, String punish) {
        this.name = name;
        this.sex = sex;
        this.salary = salary;
        this.bonus = bonus;
        this.punish = punish;
    }
}
package com.yu.Day0604Demo;
public class Topperformer {
    private String name;
    private double money;//总月薪
    @Override
    public String toString() {
        return "Topperformer{" +
                "name='" + name + '\'' +
                ", money=" + money +
                '}';
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public double getMoney() {
        return money;
    }
    public void setMoney(double money) {
        this.money = money;
    }
    public Topperformer() {
    }
    public Topperformer(String name, double money) {
        this.name = name;
        this.money = money;
    }
}
package com.yu.Day0604Demo;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.stream.Stream;
public class topperformerTest {
    public static double allmoney;
    public static void main(String[] args) {
        List<Employee> one = new ArrayList<>();
        one.add(new Employee("猪八戒",'男',30000,25000,null));
        one.add(new Employee("孙悟空",'男',2500,1000,"顶撞上司"));
        one.add(new Employee("沙僧",'男',20000,20000,null));
        one.add(new Employee("小白龙",'男',20000,25000,null));
        List<Employee> two = new ArrayList<>();
        two.add(new Employee("武松",'男',15000,9000,null));
        two.add(new Employee("李逵",'男',20000,10000,null));
        two.add(new Employee("西门庆",'男',50000,100000,"被打"));
        two.add(new Employee("潘金莲",'女',3500,1000,"被打"));
        two.add(new Employee("武大郎",'男',20000,0,"下毒"));
        //获取最高员工的工资
//        Employee onefirst = one.stream().max((e1 ,e2)->Double.compare(e1.getBonus()+ e1.getSalary(),e2.getSalary()+ e2.getBonus() )).get();
//        System.out.println(onefirst);
        //将最高工资对象存放在优秀员工里面
        Topperformer Tone = one.stream().max((e1,e2)-> Double.compare(e1.getBonus()+ e1.getSalary(),e2.getBonus()+ e2.getSalary() ))
                .map(e -> new Topperformer(e.getName(), e.getBonus()+e.getSalary())).get();
        System.out.println("一组最高工资为:"+Tone);
        Topperformer Ttwo = two.stream().max((e1,e2)-> Double.compare(e1.getBonus()+ e1.getSalary(),e2.getBonus()+ e2.getSalary() ))
                .map(e -> new Topperformer(e.getName(), e.getBonus()+e.getSalary())).get();
        System.out.println("二组最高工资为:"+Ttwo);
        //获取两个部门的平均工资
        one.stream().sorted(new Comparator<Employee>() {
            @Override
            public int compare(Employee o1, Employee o2) {
                return Double.compare(o1.getBonus()+ o1.getSalary(), o2.getBonus()+ o2.getSalary());
            }
        }).skip(1).limit(one.size()-2).forEach(employee -> {
            allmoney += (employee.getBonus()+employee.getSalary());
        });
        System.out.println("一组平均工资为:"+allmoney/(one.size()-2));
        //修改静态变量的值
        allmoney = 0;
        System.out.println(allmoney);
        two.stream().sorted(new Comparator<Employee>() {
            @Override
            public int compare(Employee o1, Employee o2) {
                return Double.compare(o1.getBonus()+ o1.getSalary(), o2.getBonus()+ o2.getSalary());
            }
        }).skip(1).limit(two.size()-2).forEach(employee -> {
            allmoney += (employee.getBonus()+employee.getSalary());
        });
        System.out.println("二组平均工资为:"+allmoney/(two.size()-2));
        //修改静态变量的值//注意清零
        allmoney = 0;
        System.out.println(allmoney);
        Stream.concat(one.stream(),two.stream()).sorted((o1, o2) -> Double.compare(o1.getBonus()+ o1.getSalary(), o2.getBonus()+ o2.getSalary() ))
                .skip(1).limit(one.size()+ two.size()-2).forEach(employee ->
                allmoney += employee.getBonus()+employee.getSalary());
        System.out.println(allmoney/(one.size()+ two.size()-2));
        BigDecimal a = BigDecimal.valueOf(allmoney);
        BigDecimal b = BigDecimal.valueOf(one.size()+two.size()-2);
        System.out.println(a.divide(b,2, RoundingMode.HALF_UP));
    }
}
收集Stream流
收集操作
收集Stream流含义:就是把Stream流操作后的结果数据转回到集合或数组中去
Stream流:方便操作集合/数组的手段
集合/数组:才是开放的目的
收集方法
| 名称 | 说明 | 
|---|---|
| R collect(collector collector) | 开始收集Stream流,指定收集器 | 
Collectors工具类提供了具体的收集方式
| 名称 | 说明 | 
|---|---|
| public static Collector toList() | 把元素收集到List集合中 | 
| public static Collector toSet() | 把元素收集到Set集合中去 | 
| Public static Collector toMap(Function keyMapperm,Function valueMapper) | 把元素收集到Map集合中去 | 
实例
package com.yu.Day0604Demo;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;
public class CollectStream {
    public static void main(String[] args) {
        List<String> names = new ArrayList<>();
        names.add("张无忌");
        names.add("周芷若");
        names.add("张三丰");
        names.add("赵敏");
        names.add("张强");
        names.add("张弓长");
        Stream<String> ss = names.stream().filter(s -> s.startsWith("张"));
        List<String> nameiszhang = ss.collect(Collectors.toList());
        System.out.println(nameiszhang);
        Stream<String> sname = names.stream().filter(s -> s.startsWith("张"));
        Object[] nameiszhang2 = sname.toArray();
        for (int i = 0; i < nameiszhang2.length; i++) {
            System.out.println(nameiszhang2[i]);
        }
    }
}
异常处理
异常概述、体系
什么是异常
- 异常是代码在编译或执行的过程中可能出现的错误
 
异常分类
- 编译时异常,运行时异常
- 编译时异常:没有继承RuntimeException的异常,编译阶段就会出错
 - 运行时异常:继承字RuntimeException的异常或其子类,编译阶段不报错,运行可能报错
 
 
学习目的
- 避免异常的出现,同时处理可能出现的异常,让代码更健壮
 
常见运行时异常
运行时异常
- 直接继承自RuntimeException或其子类,编译阶段不会报错,运行时可能出现的错误
 
运行时异常示例
- 数组索引越界异常:ArrayIndexOutOfBoundsException
 - 空指针异常: NullPointerException,直接输出没有问题,但是调用空指针的变量的功能就会报错
 - 数学操作异常:ArithmeticException
 - 类型转换异常:ClassCastException
 - 数字转换异常:NumBerFormatException
 
*** 运行时异常:一班是程序员业务没有考虑号或者编程逻辑不严谨引起的程序错误***
zero 零
常见编译时异常
编译时异常特点
- 不是RuntimeException或者其子类的异常,
 - 编译阶段就报错,必须处理,否则代码不通过
 
编译时异常的作用
- 是担心程序员的技术不行,在编译阶段就爆出一个错误,目的在于提醒不要出错
 - 编译时异常可遇不可求,遇到了就遇到呗
 
异常的默认处理流程
一般不用
*** 默认的异常处理机制并不号,一旦真的出现异常,程序立即四位***
编译时异常的处理机制
三种处理形式
- 出现的异常直接抛出去给调用者,调用者也继续抛出去
 - 出现异常自己捕获处理,不麻烦别人
 - 前两者结合,出现异常直接抛出去给调用者,调用者捕获处理
 
异常处理方式一 ——throws
- throws:用在方法上,可以将方法内部出现的异常抛出去给本方法的调用者处理
 - 这种方法并不好,发生异常的方法自己不处理异常,如果异常最终抛出去给虚拟机将引起程序死亡
 
抛出异常格式
方法 throws 异常1,异常2,异常3...{ }
规范做法
方法 throws Exception{
}
异常处理方式二——try...catch...
- 监听捕获异常,用在方法内部,可以将方法内部出现的异常直接捕获处理
 - 这种方式还可以,发生异常的方法自己独立完成异常的处理,程序可以继续往下执行。
 
格式(不推荐浪费内存空间)
try{
//监听可能出现异常的代码
}catch(异常类型1 变量){
    //处理异常
}catch(异常类型2变量){
	//处理异常
}...
建议格式
try{
    //可能出现异常的代码!
}catch(Exception e){
    e.printStackTrace();
}
Exception可以捕获处理一切异常类型
异常处理方式三——前两者结合
- 方法直接将异常通过throws抛出去给调用者
 - 调用者收到异常直接捕获处理
 
异常处理总结
- 在开发种按照规范来说第三种方式最好的;底层的异常抛出去给最外层,最外层集中捕获处理。
 - 实际应用中,只要代码能够编译通过,并且功能完成,那么每一种异常处理方式似乎也都是可以的
 
运行时异常的处理机制
运行时异常的处理形式
- 运行时异常编译阶段不会出错,是运行时才可能出错的,所以编译阶段不处理也可以。
 - 按照规范建议还是处理:建议在最外层调用处集中捕获处理即可
 
异常处理使代码更稳健的案例
package com.yu.Day0604Demo;
import java.util.Scanner;
public class userprinthowmush {
    public static void main(String[] args) {
        while (true) {
            try {
                Scanner s = new Scanner(System.in);
                System.out.println("请输入当前商品价格:");
                String mush = s.nextLine();//输入的价格不一定为纯数字组合
                double shu = Double.valueOf(mush);//可能会出现的错误 NumberFormatException
                if(shu > 0){
                    System.out.println("当前商品的价格为"+shu);
                }else{
                    System.out.println("输入价格有误,请重新输入");
                }
            } catch (Exception e) {
                System.out.println("输入价格包含英文,请重新输入!!!");
            }
        }
    }
}
自定义异常
自定义异常的分类
1、自定义编译时异常
- 定义一个异常继承Exception
 - 重写构造器
 - 在出现异常的地方用throw new 自定义对象抛出
 
作用:在编译时异常是编译阶段就报错,提醒更加强烈,一定需要处理
判断年龄是否正确
package com.yu.Day0604Demo;
public class YUAgeException extends Exception{
    public YUAgeException() {
        super();
    }
    public YUAgeException(String message) {
        super(message);
    }
}
package com.yu.Day0604Demo;
public class userAgeTexr {
    public static void main(String[] args) {
        try {
            AgeTrue(-55);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    public static void AgeTrue(int age) throws YUAgeException {
        if (age < 0 || age > 200 ){
            throw new YUAgeException();
        }else {
            System.out.println("输入年龄正确");
        }
    }
}
2、自定义运行时异常
- 定义一个异常类型继承RuntimeException
 - 重写构造器
 - 在出现异常的地方用Throw new 自定义对象抛出
 
*** 作用:提醒不强烈,编译阶段不报错!运行时才可能出现***
package com.yu.Day0604Demo;
public class YUAgeException extends RuntimeException{
    public YUAgeException() {
        super();
    }
    public YUAgeException(String message) {
        super(message);
    }
}
package com.yu.Day0604Demo;
public class userAgeTexr {
    public static void main(String[] args) {
            AgeTrue(55);
    }
    public static void AgeTrue(int age) throws YUAgeException {
        if (age < 0 || age > 200 ){
            throw new YUAgeException();
        }else {
            System.out.println("输入年龄正确");
        }
    }
}
throw:方法内部直接创建一个异常对象,并从此点抛出
throws:用在方法申明上的,爬出方法内部的异常
Javaheima13的更多相关文章
随机推荐
- Linux内核启动-从入口到start_kernel
			
目录 1. 内核启动要求 2. 内核启动入口 3. 概览:从入口到start_kernel 4. MMU开启之前:primary_entry 4.1. preserve_boot_args 4.2. ...
 - java基于ssm框架开发的视频论坛网站源码
			
简介 Java基于ssm开发的视频论坛网站,普通用户可以浏览视频搜索视频评论点赞收藏视频,关注用户.还可以浏览新闻,发布帖子到论坛. 演示视频 https://www.bilibili.com/vid ...
 - Finance财务软件(辅助核算专题)
			
支持辅助核算和数量核算
 - CSS之小知识
			
1.居中 a.文字水平居中 text-align:center; b.文字垂直居中 /* 如果有n行文字,那么将行高设为容器高度的n分之一 */ height: 35px; line-height: ...
 - Qt在任务处理密集时保持界面响应
 - Oracle11gR2安装
			
https://blog.csdn.net/newbie_907486852/article/details/80716275
 - 解决uniapp  使用自带   switch   双向绑定视图不更新的问题
			
使用 this.$set( a, b, c) a:需要更新视图属性对象 b:具体的属性值(就是你要更新视图的属性值) c:传递的参数 this.$set(this.gwjSelet,this.gwj ...
 - zabbix-proxy部署笔记
			
前提:配置好yum源 1. 安装mariadb-server systemctl start mariadb.service systemctl enable mariadb.service mysq ...
 - py打包工具
			
库地址: auto-py-to-exe https://pypi.org/project/auto-py-to-exe/ Gooey https://pypi.org/project/Gooey/ 为 ...
 - Linux服务器时间校准
			
当发现系统时间不正确时可以通过 date 命令查看Linux系统的当前时间 最简便的修改方法,我们可以通过 date -s "20190917 22:04:00" 来直接修改Lin ...