day42
JDK1.8新特性
函数式接口
方法、构造方法和数组引用
方法、构造方法和数组引用就是Lambda的另一种表现形式
方法引用
若Lamdba表达式中的内容由方法已经实现了,可以使用方法引用这个技能
当你需要使用方法引用时,目标引用放在分隔符::前,方法的名称放在后面
注意:参数个数、类型,返回值
对象::实例方法
Lambda表达式中调用方法的参数类型和返回值必须和函数式接口中的抽象方法一致
注意方法特定存在,前后对照;ps:String有equals方法,而Integer没有
public class Test01 {
public static void main(String[] args) {
// I1 i1 = new I1() {
// @Override
// public void method(String str) {
// System.out.println(str);
// }
// };
// i1.method("少年游");
// I1 i1 = (str)->System.out.println(str);
// i1.method("少年游");
//println里的参数列表和返回值类型必须和method方法一致才行
I1 i1 = System.out::println;//对象::实例方法
i1.method("少年游");
}
}
interface I1{
public void method(String str);
}
类名::静态方法
Lambda表达式中调用方法的参数类型和返回值必须和函数式接口中的抽象方法一致
public class Test01 {
public static void main(String[] args) {
// Comparator<Integer> comparator = new Comparator<Integer>() {
// @Override
// public int compare(Integer o1, Integer o2) {
// return Integer.compare(o1, o2);
// }
// };
// int compare = comparator.compare(10, 20);
// System.out.println(compare);
// Comparator<Integer> comparator = (o1,o2)-> Integer.compare(o1, o2);
// int compare = comparator.compare(10, 20);
// System.out.println(compare);
//类名::静态方法
Comparator<Integer> comparator = Integer::compare;
int compare = comparator.compare(10, 20);
System.out.println(compare);
}
}
类名::实例方法
Lambda表达式参数列表中第一个参数必须是实例方法的调用者
Lambda表达式参数列表中第二个参数必须是实例方法的参数
public class Test01 {
public static void main(String[] args) {
// I1<String> i1 = new I1<String>() {
// @Override
// public boolean method(String t1, String t2) {
// return t1.equals(t2);
// }
// };
// boolean method = i1.method("abc", "abc");
// System.out.println(method);
// I1<String> i1 = (str1,str2)->str1.equals(str2);
// boolean method = i1.method("abc", "abc");
// System.out.println(method);
//重现method方法,该方法的第一个参数调用equals,第二个参数是传入equals里的数据
I1<String> i1 = String::equals;//类名::实例方法
boolean method = i1.method("abc", "abc");
System.out.println(method);
}
}
interface I1<T>{
public boolean method(T t1,T t2);
}
构造方法引用
类名::new
需要调用的构造方法的参数列表必须和函数式接口中抽象方法的参数列表一致
public class Test01 {
public static void main(String[] args) {
// I1 i1 = new I1() {
// @Override
// public Student method() {
// return new Student();
// }
// };
// Student stu = i1.method();
// System.out.println(stu);
I1 i1 = Student::new;//调用无参构造去创建学生对象
Student stu1 = i1.method();
System.out.println(stu1);
I2 i2 = Student::new;//调用有参构造去创建学生对象
Student stu2 = i2.method("奇男子", 23, 12000, Course.JAVA);
System.out.println(stu2);
}
}
interface I1{
public Student method();
}
interface I2{
public Student method(String name, int age, double salary, Course course);
}
enum