说到JDK8新特性那就少不了Lambda表达式,Lambda表达式可以代替大部分的匿名内部类,优化我们的代码结构。之前只是简单的了解过Lambda表达式,现将其总结如下。
使用前提:使用Lambda必须要有接口,并且要求接口中有且仅有一个抽象方法。只包含一个抽象方法的接口称为函数式接口。
@FunctionalInterface
public interface InterfaceTest {
void method();
}
public class Test {
public Test(InterfaceTest interfaceTest){
interfaceTest.method();
}
public static void main(String[] args) {
//用匿名内部类方式
Test test=new Test(new InterfaceTest() {
@Override
public void method() {
System.out.println("用匿名内部类方式执行了method()方法");
}
});
//使用lambda表达式
Test test1=new Test(()->{System.out.println("用Lambda表达式执行了method()方法");});
}
}
@FunctionalInterface
public interface InterfaceTest {
void method(int a,int b);
}
public class Test {
public Test(InterfaceTest interfaceTest){
interfaceTest.method(2,5);
}
public static void main(String[] args) {
//用匿名内部类方式
Test test=new Test(new InterfaceTest() {
@Override
public void method(int a, int b) {
System.out.println("这是匿名内部类方法-----"+"a是:"+a+",b是:"+b);
}
});
//使用lambda表达式
Test test1=new Test((int a,int b)->{System.out.println("这是Lambda表达式-----"+"a是:"+a+",b是:"+b);});
}
}
@FunctionalInterface
public interface InterfaceTest {
int method();
}
public class Test {
public Test(InterfaceTest interfaceTest){
int count=interfaceTest.method();
System.out.println("返回值:"+count);
}
public static void main(String[] args) {
//用匿名内部类方式
Test test=new Test(new InterfaceTest() {
@Override
public int method() {
System.out.println("用匿名内部类执行了method()方法");
return 1;
}
});
//使用lambda表达式
Test test1=new Test(()->{
System.out.println("用Lambda表达式执行了method()方法");
return 2;
});
}
}
@FunctionalInterface
public interface InterfaceTest {
int method(int a,int b);
}
public class Test {
public Test(InterfaceTest interfaceTest){
int count=interfaceTest.method(2,5);
System.out.println("返回值:"+count);
}
public static void main(String[] args) {
//用匿名内部类方式
Test test=new Test(new InterfaceTest() {
@Override
public int method(int a, int b) {
System.out.println("用匿名内部类执行了method()方法,返回值2为a,b的和");
return a+b;
}
});
//使用lambda表达式
Test test1=new Test((int a,int b)->{
System.out.println("用Lambda表达式执行了method()方法,返回值2为a,b的和");
return a+b;
});
}
}
我们可以利用Lambda表达式的接口快速指向一个已经被实现了的方法
语法格式:方法归属者::方法名 (静态方法的归属者为类名,普通方法归属者为对象)
@FunctionalInterface
public interface InterfaceTest {
int method(int a,int b);
}
public class Test {
public static void main(String[] args) {
//当不用引用方法
InterfaceTest interfaceTest1=(a,b)->run_one(a,b);
System.out.println(interfaceTest1.method(2,7));
//当使用引用方法,且引用的方法为静态方法时
InterfaceTest interfaceTest2=Test::run_one;
System.out.println(interfaceTest2.method(4,6));
//当使用引用方法,且引用的方法为普通方法时
Test test=new Test();
InterfaceTest interfaceTest3=test::run_two;
System.out.println(interfaceTest3.method(8,20));
}
/**
* 要求
* 1.参数数量和类型要与接口中定义的一致
* 2.返回值类型要与接口中定义的一致
*/
public static int run_one(int a,int b){
return a+b;
}
public int run_two(int a,int b){
return a+b;
}
}