day08_Stream、异常、File

29 阅读7分钟

day08_Stream、异常、File

1. Stream

1.1 Stream概述

  • Stream属于JDK8的新特性,也叫Stream流,可以用于操作集合或者数组的数据
    • Stream流大量的结合了Lambda的语法风格来编程,提供了一种更加强大,更加简单的方式操作集合或者数组中的数据,代码更简洁,可读性更好
  • Stream的操作步骤
    1. 获取Stream流
    2. 调用中间方法
    3. 调用终结方法

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 (异常类名 变量名) {
    // 异常的处理代码;
}
  • 执行流程

    1. 未发生异常

      在try中未发生异常,在执行完try中代码后直接结束try-catch。

    2. 发生异常

      在try中如果遇到异常,将停止try中代码的执行,跳转到catch中执行异常的处理代码,然后结束try-catch。

  • 异常处理常用方法:

方法名说明
public String getMessage()返回此 throwable 的详细消息字符串
public String toString()返回此可抛出的简短描述
public void printStackTrace()把异常的错误信息输出在控制台

2. finally

  • 作用:在finally代码块中的代码一定会被执行
  • 格式:
try {
    // 可能出现异常的代码;
} catch (异常类名 变量名) {
    // 异常的处理代码;
} finally {
    // 必须要执行的代码;
}
  • 执行流程

    1. 未发生异常

      在try中未发生异常,在执行完try中代码后接着执行finally中的代码,然后才结束try-catch-finally。

    2. 发生异常

      在try中如果遇到异常,将停止try中代码的执行,跳转到catch中执行异常的处理代码,接着执行finally中的代码,然后才结束try-catch-finally。

3. throws

  • 作用:当方法自己无法处理某个异常时,可以把这个异常抛给别人处理
    • 抛出异常,表面处理异常,能通过编译,如果有问题会抛给调用者
    • 子类重写方法throws的异常要比父类方法throws的异常相同或更少
  • 格式:
修饰符 返回值类型 方法名(形参列表) throws 异常类名1, 异常类名2... {
    
}

2.3 自定义异常

  • 为什么要自定义异常
    • JDK提供的异常虽然比较多,但是不一定符合我们的需求
    • 我们可以根据业务的异常情况来定义异常类
  • 自定义异常的实现步骤
    1. 定义类继承Exception/RuntimeException
    2. 定义无参构造器和带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的阶乘

分析:

  1. 假如我们认为存在一个公式是 f(n) = 1*2*3*4*5*6*7*…*(n-1)*n;

  2. 那么公式等价形式就是:f(n) = f(n-1)*n

  3. 如果求的是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

演示:

递归案例演示.gif

递归算法三要素:

  • 递归的公式:f(n) = f(n-1) * n
  • 递归的终结点:f(1)
  • 递归的方向必须走向终结点