Lambda表达式的使用

说到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()方法");});
    }
}

Lambda表达式的使用_第1张图片 

二、有参无返回

@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);});
    }
}

Lambda表达式的使用_第2张图片

三、无参有返回

@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;
        });
    }
}

 Lambda表达式的使用_第3张图片

四、有参有返回

@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表达式的使用_第4张图片

五、Lambda表达式引用方法

我们可以利用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;
    }
}

 Lambda表达式的使用_第5张图片

你可能感兴趣的:(Java)