package com.yy;
/**
- 匿名内部类缺点:代码阅读性差
- 可以使用JDK8提供的新特性解决这些问题
- JDK8新特性
- 1.接口中可以使用default关键字书写普通方法
- 2.接口中也可以写静态方法
- 3.Lambda表达式解决匿名内部类代码阅读性差的问题
- 4.方法引用
- 5.stream函数式编程
- Lambda表达式属于函数式编程的体现 有些计算机语言就是函数式的语言 比如Haskell
- @author WHD
*/
//Lambda表达式和前端的箭头函数使用方法一样
public class Test2 {
public static void main(String[] args) {
//创建A接口类型的匿名类对象
A a = new A() {
//重写
@Override
public void print() {
System.out.println("匿名内部类实现方式");
}
};
//调用匿名内部类方法
a.print();
// 使用Lambda表达式的方式实现同样的效果
// 使用lambda表达式书写更为简洁 但是不能具体制定重写的是哪个方法
// 所以要求接口或者抽象类中只能有一个抽象方法
// () - > 这个是固定书写格式
//A接口类型 a1是接受对象名,(形参列表),->后面函数体
//当接口只有一个方法时,自动重写A接口里的方法
//Lambda表达式重写A接口里的print方法,并被A接口类型的对象a1接受
A a1 = ()-> System.out.println("lambda表达式方式实现");
//a1是Lambda表达式函数的对象,调用Lambda表达式重写的方法
a1.print();
//形参sb,函数体是输出传入的参数
//当接口只有一个方法时,自动默认是重写B接口里的方法
B b = (sb)-> System.out.println(sb);
//调用重写的B接口方法,并传参"hello world"
b.print("hello world");
//当接口只有一个方法时,自动默认重写此方法
//重写C接口里的print方法,形参列表是numa,numb,不声明形参类型时,默认和原方法形参类型一致
//函数体只有一句语句时,默认是返回值,返回numa + numb
C c = (numa,numb)-> numa + numb;
//输出重写的print方法并传参
System.out.println(c.print("a", 20));
//当接口只有一个方法时,自动默认重写此方法
//重写D接口里的print方法,形参列表是number1,number2,不声明形参类型时,默认和原方法形参类型一致
//函数体只有一句语句时,默认是返回值,语句大于一句时,要return声明返回值语句
D d = (number1,number2)-> {
String str = "hello";
return str;
};
// E e = () -> "hello world"; 抽象类不能使用lambda表达式
}
}
interface D{
String print(int a , int b);
}
@FunctionalInterface
interface A{
void print();
}
@FunctionalInterface
interface B{
void print(String a);
}
interface C{
String print(String a,int b);
}