一.方法引用
1.方法引用概述
eg:
表示引用run1类里面的sxxxx方法
把这个方法当做抽象方法的方法体
::是方法引用符
java
//方法引用
Integer[] arr={4,3,1,6,2,7,8,5};
Arrays.sort(arr,run1::subtraction);
System.out.println(Arrays.toString(arr));
}
public static int subtraction(int num1,int num2){
return num2-num1;
}
}
2.引用静态方法
1.方法需要已经存在
2.方法的形参和返回值需要跟抽象方法的形参和返回值保持一致
3.方法的功能需要把形参的字符串转换成整数
eg:
java
ArrayList<String> list10 = new ArrayList<>();
Collections.addAll(list10, "1","4","3","2","6");
list10.stream()
.map(Integer::parseInt)
.forEach(s->System.out.println(s));
3.引用成员方法
格式:对象::成员方法
1.其他类:其他类对象::方法名
2.本类:this::方法名(引用出处不能是父类方法)
3.父类:super::方法名
i.引用其他成员方法
java
public class run2 {
public static void main(String[] args) {
ArrayList<String> list1=new ArrayList<>();
Collections.addAll(list1,"张ad","刘df","张ty","周kdh","fjd");
list1.stream().filter(new fangfa2()::findzhnag)
.forEach(s -> System.out.println(s));
}
}
//***************************
public class fangfa2 {
public boolean findzhnag(String s){
return s.startsWith("张")&&s.length()==3;
}
}
ii.引用本类成员方法
2.eg:静态方法中是没有this的
java
public class run2 {
public static void main(String[] args) {
ArrayList<String> list1=new ArrayList<>();
Collections.addAll(list1,"张ad","刘df","张ty","周kdh","fjd");
list1.stream().filter(new run2()::findzhnag)
.forEach(s -> System.out.println(s));
}
public boolean findzhnag(String s){
return s.startsWith("张")&&s.length()==3;
}
}
iii.引用父类成员方法
略
4.引用构造方法
格式 :类名::new
范例:Student::new
eg1:
java
//匿名内部类
List<Student> newlist1 = list1.stream().map(new Function<String, Student>() {
@Override
public Student apply(String s) {
String[] arr = s.split(",");
String name = arr[0];
int age = Integer.parseInt(arr[1]);
return new Student(name, age);
}
}).collect(Collectors.toList());
//lambda
List<Student> new2list1 = list1.stream()
.map(s -> new Student(s.split(",")[0]
, Integer.parseInt(s.split(",")[1])))
.collect(Collectors.toList());
e:2:
java
//引用构造方法
List<Student> new3list1 = list1.stream().map(Student::new).collect(Collectors.toList());
System.out.println(new3list1);
//其中Strudent这个类里面要加上
public Student(String str) {
String[] arr = str.split(",");
this.name = arr[0];
this.age = Integer.parseInt(arr[1]);
}
为什么要加:因为被引用的方法的形参和返回值,需要跟抽象方法的形参返回值保持一致
从eg1中的匿名内部类看出
@Override
public Student apply(String s) {
是有一个String s的,所以这时需要再Student类中构造一个
public Student(String str) {
函数,str表示流里面的数据
5.其他调用方式
i.使用类名引用成员方法
格式:类名::成员方法
范例:String::substring
练习 :集合里面一些字符串,要求变成大写后进行输出
eg:
java
ArrayList<String> list2=new ArrayList<>();
Collections.addAll(list2,"aaa","bbb","ccc","ddd");
list2.stream().map(String::toUpperCase).forEach(s -> System.out.println(s));
意思是:第一个参数是什么类,就可以直接引用这个类里面跟后面参数跟抽象方法一样的成员方法。这也就是为什么形参不一致也可以,一个有一个形参一个无形参。就是没有第二个参数,说明引用方法是无参的
局限性: 1.不能阴影所有类中的成员方法。2.是跟抽象方法的第一个参数有关,这个参数是什么类型的,那么就只能应用这个类中的方法。
ii.引用数组的构造方法
格式:数据类型[ ]::new
范例:int[ ]::new
练习:集合中存储一些整数,收集到数组当中
java
ArrayList<Integer> list3=new ArrayList<>();
Collections.addAll(list3,1,2,3,4);
Integer[] arr = list3.stream().toArray(Integer[]::new);
System.out.println(Arrays.toString(arr));
细节:数组的类型需要和流中的数据类型保持一致
二、异常
1.异常的作用
异常作用一:异常是用来查询bug的关键参考信息
异常作用二:异常可以作为方法内部的一种特殊返回值,以便通知调用者底层的执行情况
2.异常的处理方式
i.JVM默认的处理方式
把异常名称,原因及位置等信息输出在了控制台,程序停止,异常下面的不会再执行
ii.自己处理(捕获异常)
java
try{
//可能出现异常的代码
}catch(异常类名 变量名){
//异常的处理代码
}
目的:当代码出现异常时,可以让程序继续往下执行
注意:如果try中没有遇到问题,会吧try里面的全部执行完毕不会执行catch里面的代码,只有出现异常才会执行catch
注意:如果try里面有多个异常,要写多个catch与之对应,细节:如果要捕获多个异常,这些异常如果存在父子关系的话,那么父类一定要写在下面
注意:如果try中遇到的问题没有被捕获,相当于try....catch的代码白写了,最终还是会交给虚拟机处理(默认处理方式)
注意:try中遇到了问题,那么try下面的其他代码不会执行,直接跳转到相对应的catch,如果没有相对应的catch与之匹配,则交给虚拟机处理
iii.抛出异常
iiii.异常中的常用方法
Throwable的成员方法
//快捷键生成,ctrl alt+t