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:用在方法申明上的,爬出方法内部的异常

最新文章

  1. android基于口令加密快速搞懂(一)
  2. Shader的学习方法总结
  3. JavaScript 冒泡排序和选择排序
  4. 查询oracle数据库中的所有表空间信息
  5. 【CF】148D Bag of mice
  6. js-弹出窗口
  7. pptp建立vpn
  8. iOS 消息推送原理及实现Demo
  9. css3 动画贝塞尔曲线
  10. 剑指Offer39 数组中寻找和为sum的两个数字
  11. ASP.NET中的FileUpload文件上传控件的使用
  12. Lucene多字段搜索
  13. Web Service和Servlet的区别(转)
  14. java jdk缓存-128~127的Long与Integer
  15. JavaScript函数补完:toString()
  16. 第九章:Python の 网络编程基础(一)
  17. 【unix网络编程第三版】阅读笔记(三):基本套接字编程
  18. android自定义组件的简易实现
  19. 带你由浅入深探索webpack4(二)
  20. Oracle 数据库导入与出

热门文章

  1. MVP模式(转)
  2. SparkRDD所有算子操作,建议全部手敲一遍
  3. 空间数据格式(地理数据格式):GeoJSON(FeatureCollection)与EsriJSON(FeatureSet/ArcGIS格式)
  4. python pip 下载出问题解决方法(超时出错)
  5. php严格模式的使用
  6. Kubernetes基础配置管理
  7. Little Girl and Maximum Sum CodeForces - 276C - 差分
  8. linux Qt编译自己的动态库(.so),详细全流程
  9. ping 请求找不到主机 www.baidu.com
  10. select from 多表和inner join的区别