day08_Stream、异常、File
1. Stream
1.1 Stream概述
- Stream属于JDK8的新特性,也叫Stream流,可以用于操作集合或者数组的数据
- Stream流大量的结合了Lambda的语法风格来编程,提供了一种更加强大,更加简单的方式操作集合或者数组中的数据,代码更简洁,可读性更好
- Stream的操作步骤
- 获取Stream流
- 调用中间方法
- 调用终结方法
1.2 常用方法
获取Stream的方法
-
获取集合的Stream流
default Stream<E> stream()
-
获取数组的Stream流
static <T> Stream<T> stream(T[] array)
-
获取零散数据的Stream流
static <T> Stream<T> of(T... values)
常见的中间方法
Stream提供的常用中间方法 | 说明 |
---|---|
Stream<T> filter(Predicate<? super T> predicate) | 用于对流中的数据进行过滤。 |
Stream<T> sorted() | 对元素进行升序排序 |
Stream<T> sorted(Comparator<? super T> comparator) | 按照指定规则排序 |
Stream<T> limit(long maxSize) | 获取前几个元素 |
Stream<T> skip(long n) | 跳过前几个元素 |
Stream<T> distinct() | 去除流中重复的元素 |
<R> Stream<R> map(Function<? super T,? extends R> mapper) | 对元素进行加工,并返回对应的新流 |
static <T> Stream<T> concat(Stream a, Stream b) | 合并a和b两个流为一个流 |
常见的终结方法
Stream提供的常用终结方法 | 说明 |
---|---|
void forEach(Consumer action) | 对此流运算后的元素执行遍历 |
long count() | 统计此流运算后的元素个数 |
Optional<T> max(Comparator<? super T> comparator) | 获取此流运算后的最大值元素 |
Optional<T> min(Comparator<? super T> comparator) | 获取此流运算后的最小值元素 |
R collect(Collector collector) | 把流处理后的结果收集到一个指定的集合中去 |
Object[] toArray() | 把流处理后的结果收集到一个数组中去 |
收集Stream的方法
Collectors工具类提供了具体的收集方式 | 说明 |
---|---|
public static <T> Collector toList() | 把元素收集到List集合中 |
public static <T> Collector toSet() | 把元素收集到Set集合中 |
public static Collector toMap(Function keyMapper , Function valueMapper) | 把元素收集到Map集合中 |
2. 异常
2.1 异常概述
- 什么是异常?
- 程序出现问题就是异常
- 分为编译时异常和运行时异常
- 编译时异常:在编译的时候检测的异常
- 运行时异常:在运行时候检测的异常
- 常见异常
- ArrayIndexOutOfBoundsException:数组索引越界异常
- NullPointerException:空指针异常
- ClassCastException:类型转换异常
- ArithmeticException:数学计算异常
- ParseException:日期解析异常
2.2 异常处理方式
1. try-catch
-
作用:可以让程序继续往下执行
-
格式:
try {
// 可能出现异常的代码;
} catch (异常类名 变量名) {
// 异常的处理代码;
}
-
执行流程
-
未发生异常
在try中未发生异常,在执行完try中代码后直接结束try-catch。
-
发生异常
在try中如果遇到异常,将停止try中代码的执行,跳转到catch中执行异常的处理代码,然后结束try-catch。
-
-
异常处理常用方法:
方法名 | 说明 |
---|---|
public String getMessage() | 返回此 throwable 的详细消息字符串 |
public String toString() | 返回此可抛出的简短描述 |
public void printStackTrace() | 把异常的错误信息输出在控制台 |
2. finally
- 作用:在finally代码块中的代码一定会被执行
- 格式:
try {
// 可能出现异常的代码;
} catch (异常类名 变量名) {
// 异常的处理代码;
} finally {
// 必须要执行的代码;
}
-
执行流程
-
未发生异常
在try中未发生异常,在执行完try中代码后接着执行finally中的代码,然后才结束try-catch-finally。
-
发生异常
在try中如果遇到异常,将停止try中代码的执行,跳转到catch中执行异常的处理代码,接着执行finally中的代码,然后才结束try-catch-finally。
-
3. throws
- 作用:当方法自己无法处理某个异常时,可以把这个异常抛给别人处理
- 抛出异常,表面处理异常,能通过编译,如果有问题会抛给调用者
- 子类重写方法throws的异常要比父类方法throws的异常相同或更少
- 格式:
修饰符 返回值类型 方法名(形参列表) throws 异常类名1, 异常类名2... {
}
2.3 自定义异常
- 为什么要自定义异常
- JDK提供的异常虽然比较多,但是不一定符合我们的需求
- 我们可以根据业务的异常情况来定义异常类
- 自定义异常的实现步骤
- 定义类继承
Exception
/RuntimeException
- 定义无参构造器和带String的构造方法
- 定义类继承
3. File
3.1 文件概述
File
- 文件是一种在计算机硬盘中非常重要的存储方式,即便断电,或者程序终止了,存储在硬盘文件中的数据也不会丢失
- File是java.io包下的类,File类的对象是文件和目录路径名的抽象表示
- File类只能对文件本身进行操作,不能读写文件里面存储的数据
路径
- 绝对路径:从盘符开始的路径,例如:
D:\zhuzi\a.txt
- 相对路径:不带盘符,默认直接到当前工程下的目录寻找文件,例如:
.\a.txt
表示当前工程目录下的a.txt文件
3.2 常用方法
创建对象
构造器 | 说明 |
---|---|
public File(String pathname) | 根据文件路径创建文件对象 |
public File(String parent, String child) | 根据父路径和子路径名字创建文件对象 |
public File(File parent, String child) | 根据父路径对应文件对象和子路径名字创建文件对象 |
注意:
- File对象既可以代表文件,也可以代表文件夹
- File封装的对象仅仅是一个路径名,这个路径可以是存在的,也允许是不存在的
创建文件、删除文件
方法名称 | 说明 |
---|---|
public boolean createNewFile() | 创建一个新的空的文件 |
public boolean mkdir() | 只能创建一级文件夹 |
public boolean mkdirs() | 可以创建多级文件夹 |
public boolean delete() | 删除文件、空文件夹 |
注意:delete方法默认只能删除文件和空文件夹,删除后的文件不会进入回收站
判断文件类型、获取文件信息
方法名称 | 说明 |
---|---|
public boolean exists() | 判断当前文件对象,对应的文件路径是否存在,存在返回true |
public boolean isFile() | 判断当前文件对象指代的是否是文件,是文件返回true,反之 |
public boolean isDirectory() | 判断当前文件对象指代的是否是文件夹,是文件夹返回true,反之 |
public String getName() | 获取文件的名称(包含后缀) |
public long length() | 获取文件的大小,返回字节个数 |
public long lastModified() | 获取文件的最后修改时间 |
public String getPath() | 获取创建文件对象时,使用的路径 |
public String getAbsolutePath() | 获取绝对路径 |
遍历文件夹
方法名称 | 说明 |
---|---|
public String[] list() | 获取当前目录下所有的"一级文件名称"到一个字符串数组中去返回 |
public File[] listFiles() | 获取当前目录下所有的"一级文件对象"到一个文件对象数组中去返回 |
使用listFiles方法时的注意事项:
- 当主调是文件,或者路径不存在时,返回null
- 当主调是空文件夹时,返回一个长度为0的数组
- 当主调是一个有内容的文件夹时,将里面所有一级文件和文件夹的路径放在File数组中返回
- 当主调是一个文件夹,且里面有隐藏文件时,将里面所有文件和文件夹的路径放在File数组中返回,包含隐藏文件
- 当主调是一个文件夹,但是没有权限访问该文件夹时,返回null
4. 递归
4.1 递归概述
- 递归是一种在程序设计语言中广泛应用的算法
- 实现的方式是方法自己调用自己或方法调用其他方法,其他方法又回调方法自己
- 需要注意控制终止,防止栈内存溢出
4.2 案例演示
需求:计算n的阶乘
分析:
-
假如我们认为存在一个公式是 f(n) = 1*2*3*4*5*6*7*…*(n-1)*n;
-
那么公式等价形式就是:f(n) = f(n-1)*n
-
如果求的是1-5的阶乘 的结果,我们手工应该应该如何应用上述公式计算
f(5) = f(4) * 5
f(4) = f(3) * 4
f(3) = f(2) * 3
f(2) = f(1) * 2
f(1) = 1
演示:
递归算法三要素:
- 递归的公式:f(n) = f(n-1) * n
- 递归的终结点:f(1)
- 递归的方向必须走向终结点