本文最后更新于 443天前,其中的信息可能已经有所发展或是发生改变。若对文章内容存疑,或是本文的转载部分侵犯了您的权益,请联系博主 3240572824@qq.com
来到Java进阶
Stream
流,可以理解成流水线,是对集合对象的功能增强。它结合Lambda表达式,专注于对集合对象进行各种非常便利、高效的聚合操作,或者大批量数据操作,既简便又利于阅读。
使用步骤
获取到一条Stream流,并加入数据
其中,双列集合需要先转为单列集合,再使用流。
HashMap<String, Integer> hm = new HashMap<>();
hm.put("aaa", 111);
hm.put("bbb", 222);
hm.put("ccc", 333);
hm.put("ddd", 444);
// 第一种获取stream流
hm.keySet().stream().forEach(key -> System.out.println(key));
// 第二种获取stream流
hm.entrySet().stream().forEach(keyValue-> System.out.println(keyValue));
利用Stream流中的API进行各种操作
对流中数据的操作分为两类
- 中间操作/中间方法 方法调用完毕后,还可以调用其他方法,例如过滤、转换操作等
- 终结操作/终结方法 方法的最后一步,调用完毕后就得到最终结果,例如统计、打印操作等
方法引用
将已有的方法拿来使用,当作函数式接口中抽象方法的方法体 (用符号“::”表示)
要求
- 引用处需要函数式接口
- 被引用方法需已存在(Java写好或第三方库)
- 被引用方法形参与返回值与抽象方法形参 返回值一致
- 被引用方法功能满足需求
常见使用场景
静态方法引用
ArrayList<String>list=new ArrayList<>();
Collections.addAll(list,"1","5","4","6","7");
list.stream()
.map(Integer::parseInt)
.forEach(s-> System.out.print(s)); // 15467
成员方法引用
public class StringOperation {
public boolean stringJudge(String s) {
return s.startsWith("张") && s.length() == 2;
}
}
ArrayList<String>list=new ArrayList<>();
Collections.addAll(list,"张三","张山","周珊","张三风","李四");
list.stream()
.filter(new StringOperation()::stringJudge)
.forEach(s-> System.out.println(s));
} // 张三
// 张山
特定类的任意对象方法引用
ArrayList<String>list=new ArrayList<>();
Collections.addAll(list,"aaa","bbb","ccc","ddd");
list.stream().map(String::toUpperCase).forEach(s -> System.out.println(s));
// AAA
// BBB
// CCC
// DDD
构造方法引用
ArrayList<String> list=new ArrayList<>();
Collections.addAll(list,"张三,12","张山,13","周珊,24","张三风,23","李四,34");
List<Student> newList1 = list.stream().map(Student::new).collect(Collectors.toList());
System.out.println(newList1);
// [Student{name = 张三, age = 12}, Student{name = 张山, age = 13}, Student{name = 周珊, age = 24}, Student{name = 张三风, age = 23}, Student{name = 李四, age = 34}]
数组引用
用于创建一指定类型的数组,注意创建数组的类型需与流中数据类型一致。
ArrayList<Integer>list=new ArrayList<>();
Collections.addAll(list,1,2,3,4,5,6,7);
Integer[] arr = list.stream().toArray(Integer[]::new);
System.out.println(Arrays.toString(arr)); // [1, 2, 3, 4, 5, 6, 7]
异常
程序中可能出现的问题。是查询bug的关键参考信息,亦可作为方法的返回值,用于通知调用处底层的执行情况。异常分为两类:
- 编译时异常(未继承RuntimeException的异常,直接继承于Exception,编译阶段就会报错)
- 运行时异常(RuntimeException本身和子类,编译阶段不会报错,运行时出现)
异常处理
对于异常,JVM默认会将其信息(异常名称、原因、出错的位置等)打印在控制台,并停止程序运行(异常之后的代码不再运行)。
除了系统对异常的默认处理方式之外,也可以自己处理异常
- try catch 捕获-捕获异常,执行处理逻辑,还可以添加finally语句强制执行某代码块
- throw 抛出-将异常上抛给调用者,并终止程序
int[]arr={1,2,3,4,5,6,7};
System.out.println("啊对对对!");
try{
// 可能出异常的代码
System.out.println(arr[10]);// 此处出现异常 程序于此处创建一个ArrayIndexOutOfBoundsException对象
// new ArrayIndexOutOfBoundsException();
// 拿着这个对象到小括号中对比,看括号中的变量是否可接收此对象
// 若接收 即该异常被捕获 继而执行catch内的代码
// 当catch内代码执行完毕 则程序不被打断 try catch后的代码正常执行
}catch (ArrayIndexOutOfBoundsException e){
System.out.println("对你大爹");
}
System.out.println("有点东西");// 因为有try catch而未被影响 正常运行
// 啊对对对!
// 对你大爹
// 有点东西
文件与文件流
文件对象 File
File对象表示一个路径,可以是文件路径或是文件夹路径。分为两类:
- 相对路径 “a.text”
- 绝对路径 “c:\\a.text”
三种构造方法
- public File(String pathname) 将字符串表示的路径变成File对象
- public File(String parent,String child) 将父级/子级路径拼接
- public File(File parent,String child) 将父级路径与子级路径字符串拼接
常见成员方法
- public boolean isDirectory() 判断此路径表示的File是否为文件夹
- public boolean isFile() 判断此路径表示的File是否为文件
- public boolean exists() 判断此路径表示的File是否存在
- public long length() 返回文件的大小(字节数)
- public boolean createNewFile() 创建一个新的空文件
- public boolean mkdir() 创建单级文件夹
- public boolean mkdirs() 创建多级文件夹
- public boolean delete() 删除文件、文件夹
- public File[] listFiles() 获取此路径下所有内容
文件流 IOStream
此内容也是非常庞大且重要,所以我在另一篇文章中做更详细的总结阐述,链接如下。