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对象时可以选择相对路径和绝对路径两种, 但是比较推荐相对路径, 相对路径是指没有盘符的路径, 默认是在工程的根目录下, 这样就算代码拷贝到其他电脑上也能正常运行