Java:(学习笔记)七、Stream流、异常、日志框架
第八章—Stream流、异常、日志框架
一、Stream流
1、说明
由于Lambda所带来的函数式编程,引入了Stream流的概念,目的是为了简化集合和数组操作的API。
2、核心思想
先得到集合或者数组的Stream流,把元素放上去,然后就用这个Stream流简化的API来方便的操作元素。
3、Stream流的获取
1)Stream流的三类方法
①获取Stream流
②中间方法
③终结方法
2)集合获取Stream流的方式
使用Collection接口中的默认方法stream()生成流。
3)数组获取Stream流的方式
①获取当前数组的Stream流:
public static Stream stream(T[] array)
②获取当前数组/可变数据的Stream流
public static Stream of(T… values)
4、Stream流的常用API
1)中间方法
方法 | 说明 |
---|---|
Stream filter(Predicate<? super T> predicate) | 用于对流中的数据进行过滤。 |
Stream limit(long maxSize) | 获取前几个元素 |
Stream skip(long n) | 跳过前几个元素 |
Stream distinct() | 去除流中重复的元素。依赖(hashCode和equals方法) |
static Stream concat(Stream a, Stream b) | 合并a和b两个流为一个流 |
注意:中间方法也称为非终结方法,调用完成后返回新的Stream流可以继续使用,支持链式编程。在Stream流中无法直接修改集合、数组中的数据。
2)终结方法
方法 | 说明 |
---|---|
void forEach(Consumer action) | 对此流的每个元素执行遍历操作 |
long count() | 返回此流中的元素数 |
注意:终结操作方法,调用完成后流就无法继续使用了,原因是不会返回Stream了。
5、收集Stream流
1)说明
就是把Stream流操作后的结果数据转回到集合或者数组中去。
2)收集方法
方法 | 说明 |
---|---|
R collect(Collector collector) | 开始收集Stream流,指定收集器 |
public static Collector toList() | 把元素收集到List集合中 |
public static Collector toSet() | 把元素收集到Set集合中 |
public static Collector toMap(Function keyMapper , Function valueMapper) | 把元素收集到Map集合中 |
二、异常
1、说明
异常是程序在“编译”或者“执行”的过程中可能出现的问题。
注意:语法错误不算在异常体系中。
异常一旦出现了,如果没有提前处理,程序就会退出JVM虚拟机而终止。
研究异常并且避免异常,然后提前处理异常,体现的是程序的安全, 健壮性。
2、异常体系
异常分为Error和Exception两类,Exception又分为RuntimeException及其子类和除RuntimeException之外所有的异常。
Error:系统级别问题、JVM退出等,代码无法控制。
Exception:java.lang包下,称为异常类,它表示程序本身可以处理的问题
RuntimeException及其子类:运行时异常,编译阶段不会报错。 (空指针异常,数组索引越界异常)
除RuntimeException之外所有的异常:编译时异常,编译期必须处理的,否则程序不能通过编译。 (日期格式化异常)。
3、编译时异常和运行时异常
1)编译时异常,是在编译成class文件时必须要处理的异常,也称之为受检异常。就是在编译的时候出现的异常。
2)运行时异常,在编译成class文件不需要处理,在运行字节码文件时可能出现的异常。就是在运行时出现的异常。
3)常见运行时异常
①数组索引越界异常: ArrayIndexOutOfBoundsException
②空指针异常 : NullPointerException,直接输出没有问题,但是调用空指针的变量的功能就会报错。
③数学操作异常:ArithmeticException
④类型转换异常:ClassCastException
⑤数字转换异常: NumberFormatException
4)常见编译时异常
编译阶就报错,必须处理,否则代码不通过。
4、异常的默认处理流程
①默认会在出现异常的代码那里自动的创建一个异常对象:ArithmeticException。
②异常会从方法中出现的点这里抛出给调用者,调用者最终抛出给JVM虚拟机。
③虚拟机接收到异常对象后,先在控制台直接输出异常栈信息数据。
④直接从当前执行的异常点干掉当前程序。
⑤后续代码没有机会执行了,因为程序已经死亡
5、编译时异常的处理机制
1)处理形式
①出现异常直接抛出去给调用者,调用者也继续抛出去。
②出现异常自己捕获处理,不麻烦别人。
③前两者结合,出现异常直接抛出去给调用者,调用者捕获处理。
2)throws
用在方法上,可以将方法内部出现的异常抛出去给本方法的调用者处理。
这种方式并不好,发生异常的方法自己不处理异常,如果异常最终抛出去给虚拟机将引起程序死亡。
方法 throws 异常1 ,异常2 ,异常3 ..{
...
}
3)try——catch——
监视捕获异常,用在方法内部,可以将方法内部出现的异常直接捕获处理。
这种方式还可以,发生异常的方法自己独立完成异常的处理,程序可以继续往下执行。
try{
// 监视可能出现异常的代码!
}catch(异常类型1 变量){
// 处理异常
}catch(异常类型2 变量){
// 处理异常
}...
4)前两者结合
方法直接将异通过throws抛出去给调用者
调用者收到异常后直接捕获处理。
6、运行时异常的处理机制
运行时异常编译阶段不会出错,是运行时才可能出错的,所以编译阶段不处理也可以。
按照规范建议还是处理:建议在最外层调用处集中捕获处理即可。
7、自定义异常
1)说明
Java无法为这个世界上全部的问题提供异常类。
自定义异常可以使用异常的机制管理业务问题,如提醒程序员注意。同时一旦出现bug,可以用异常的形式清晰的指出出错的地方。
2)自定义编译时异常
①定义一个异常类继承Exception.
②重写构造器。
③在出现异常的地方用throw new 自定义对象抛出,
④作用:编译时异常是编译阶段就报错,提醒更加强烈,一定需要处理!!
3)自定义运行时异常
①定义一个异常类继承RuntimeException.
②重写构造器。
③在出现异常的地方用throw new 自定义对象抛出!
④作用:提醒不强烈,编译阶段不报错!!运行时才可能出现!!
三、日志框架
1、说明
日志技术可以将系统执行的信息选择性的记录到指定的位置(控制台、文件中、数据库中)。可以随时以开关的形式控制是否记录日志,无需修改源代码。
2、日志技术体系
日志技术体系分为Commons Logging和Simple Logging Facade for Java两个日志规范接口。又包含Log4j,JUL(java.util.loggiing),Logback,其他实现等日志实现框架
日志规范:一些接口,提供给日志的实现框架设计的标准。
日志框架:牛人或者第三方公司已经做好的日志记录实现代码,后来者直接可以拿去使用。
因为对Commons Logging的接口不满意,有人就搞了SLF4J。因为对Log4j的性能不满意,有人就搞了Logback。
3、Logback概述
Logback是由log4j创始人设计的另一个开源日志组件,性能比log4j要好
官方网站:https://logback.qos.ch/index.html
Logback是基于slf4j的日志规范实现的框架。
Logback主要分为三个技术模块:
①logback-core: logback-core 模块为其他两个模块奠定了基础,必须有。
②logback-classic:它是log4j的一个改良版本,同时它完整实现了slf4j API。
③logback-access 模块与 Tomcat 和 Jetty 等 Servlet 容器集成,以提供 HTTP 访问日志功能