Stream - Exception - File

77 阅读6分钟

Stream - Exception - File

1 Stream

1.1 作用

​ Stream是一种方法, 用于操作集合或者数组的数据, 其目的是对数据进行处理, 并输出

​ Stream流:方便操作集合/数组的手段; 集合/数组:才是开发中的目的

1.2 优势

​ 结合了Lambda的语法风格来编程, 提供了一种更加强大, 更加简单的方式操作集合或者数组中的数据, 代码更简洁, 可读性更好

1.3 获取Stream流
1.3.1 获取集合的Stream流

​ 集合对象.stream() 注意,map不能直接获取Stream流, 但是可以获取键值对的Stream

   //集合的stream流获取
	Map<String, String> map = new HashMap<>();
    Set<Map.Entry<String, String>> entries = map.entrySet();
    Stream<Map.Entry<String, String>> stream3 = entries.stream();
1.3.2 获取数组的Stream流

​ Arrays类提供的: public static Stream stream(T[] array)

​ 注意, 这里的Stream是获取泛型stream流, 基本数据类型的stream可以获取到,但是类型不同, 例如int[]arr 为IntStream类型

    // 获取数组的Stream
    String[] arr = new String[5];
    Stream<String> stream4 = Arrays.stream(arr);
    int[] arr2 = {11, 22, 33, 44};
    IntStream s = Arrays.stream(arr2);
1.3.3 获取零散数据的Stream流

​ Stream类提供的: public static Stream of(T... values)

    Stream<String> stream5 = Stream.of("张三", "李四", "王五");
    Stream<String> stream6 = Stream.of(arr);
1.4 方法
1.4.1中间方法

​ 中间方法指调用完成后会返回新的Stream流,可以继续使用(支持链式编程)

​ - *用于对流中的数据进行过滤: Stream filter(Predicate<? super T> predicate)

​ -* 对元素进行升序排序: Stream sorted()

​ - 按照指定规则排序: Stream sorted(Comparator<? super T> comparator)

​ - 获取前几个元素: Stream limit(long maxSize)

​ - 跳过前几个元素: Stream skip(long n)

​ - 去除流中重复的元素: Stream distinct() (*注意 dinstice 去重 重写equals和hashcode是dinstict里面的逻辑和arraylist无关 )

​ - 对元素进行加工,并返回对应的新流: Stream map(Function<? super T,? extends R> mapper)

​ - 合并a和b两个流为一个: static Stream concat(Stream a, Stream b)

1.4.2 终结方法

​ 终结方法指的是调用完成后,不会返回新Stream了,没法继续使用流了

​ - *对此流运算后的元素执行遍历: void forEach(Consumer action)

​ - 统计此流运算后的元素个数: long count()

​ - 获取此流运算后的最大值元素: Optional max(Comparator<? super T> comparator)

​ - 获取此流运算后的最小值元素: Optional min(Comparator<? super T> comparator)

1.4.3 收集方法

​ 就是把Stream流操作后的结果转回到集合或者数组中去返回, 因为实际开发中,用集合、数组更多

​ - 把流处理后的结果收集到一个指定的集合中去: R collect(Collector collector)

​ - 把元素收集到List集合中: public static Collector toList()

​ - 把元素收集到Set集合中: public static Collector toSet()

​ - 把元素收集到Map集合中: public static Collector toMap(Function keyMapper , Function valueMapper)

​ - 把流处理后的结果收集到一个数组中去: Object[] toArray()

2 Exception

2.1 概念

​ 叫异常,它代表的才是我们程序可能出现的问题,所以,我们程序员通常会用Exception来封装程序出现的问题

2.2 分类
2.2.1 运行时异常

​ RuntimeException及其子类,编译阶段不会出现错误提醒,运行时出现的异常(如:数组索引越界异常)

2.2.2 编译时异常

​ 编译阶段就会出现错误提醒的。(如:日期解析异常)

2.3 *处理异常的方式
2.3.1 try/catch处理异常, 负责任

​ 好处: 程序还可以继续往下执行

​ 注意事项: catch的时候,可以直接catchException

//先执行try里面的内容,如果有异常则执行catch的内容,如果没有则不执行,程序继续往下走
try {
   可能出现异常的代码;
} catch(异常类名 变量名) {
   异常的处理代码;
}
2.3.2 throws处理异常, 不负责任

​ 使用场景: 当方法自己无法处理某个异常时,可以把这个异常抛给别人处理。

​ 作用: 抛出异常,表面处理异常,能通过编译,如果有问题会抛给调用者.

​ 另外可以提到警示的作用, 如果a方法引用了b方法, b方法有异常, 可通过throws一步一步向上抛. 最终由main方法进行try-catch处理

​ Runtime Exception进行throws处理不会报异常, 因为在运行时才调用

//如果碰到了异常,则抛出,抛出的时候,方法结束,同一个方法后面的内容就没有办法执行了
修饰符 返回值类型 方法名(参数) throws 异常类名1, 异常类名2 { 
} 

2.3.3 异常处理选择方案

​ => 如果有多层嵌套调用, 顶层要使用try... catch

​ => 这时候底层可以使用try-catch 或者throws,( 如果要起到提示的作用, 如前文提到 )

2.4 finally
2.4.1 作用

​ 1) 有一些特定的代码无论异常是否发生,都需要执行。另外,因为异常会引发程序跳转,导致有些语句执行不到。而finally就是解决这个问题的

​ 2) 用于关闭资源, 释放资源, 例如,流资源, IO流

2.4.2 执行流程

​ 1) 先执行try里面的内容,如果有异常,则执行catch,最后执行finally

​ 2) 如果没有异常,则执行try之后,就执行finally

​ 3) 如果catch里面有返回值,就会在执行return 之前执行finally

2.5 自定义异常
2.5.1 步骤

​ 1) 定义类继承Exception/RuntimeException

​ 2) 编写构造器

2.5.2 意义

​ 让控制台的报错信息更加的直接清晰

3 File

3.1 概念

​ - File对象既可以代表文件、也可以代表文件夹

​ - File封装的对象仅仅是一个路径名,这个路径可以是存在的,也允许是不存在的。

3.2 创建file对象

​ - 根据文件路径创建文件对象: public File(String pathname)

​ - 根据父路径和子路径名字创建文件对象: public File(String parent, String child)

​ - 根据父路径对应文件对象和子路径名字创建文件对象: public File(File parent, String child)

3.3 创建文件和删除文件的方法

​ - 创建文件: createNewFile()

​ - 创建文件夹: mkdir()

​ - 创建多级文件夹: mkdirs()

​ - 删除文件、文件夹: delete() 一定是一个空文件夹才能删除, 而且该删除方法不会放入回收站 !

3.4 判断文件类型、获取信息的方法

​ - 判断是否存在: exists()

​ - *判断是否为文件: isFile()

​ - *判断是否为文件夹: isDirectory()

​ - 获取文件大小: length()

​ - 获取文件名字: getName()

​ - 获取文件路径: getPath()

​ - *获取文件的绝对路径: getAbsolutePath()

​ - 获取最后修改时间: lastModified()

3.5 路径的选择

​ 虽然创建文件File对象时可以选择相对路径和绝对路径两种, 但是比较推荐相对路径, 相对路径是指没有盘符的路径, 默认是在工程的根目录下, 这样就算代码拷贝到其他电脑上也能正常运行