震惊!lambda竟然是这样的

174 阅读2分钟

lambda表达式

λ是希腊字母

避免匿名内部类定义过多

属于函数式编程

函数式接口时java8 lambda的核心所在

函数式接口的定义:

1、任何接口。如果只包含唯一一个抽象方法,那麽他就是一个函数式接口。

例如:

public interface Runnable{
    public abstract void run();
}

2、对于函数式接口,我们可以通过lambda表达式来创建该接口的对象。

lambda的演化过程

public class TestLambda1 {
 
    /**
     * 2、定义一个实现类
     */
   static class Like2 implements ILike{
 
        @Override
        public void lambda() {
            System.out.println("test lambda2");
        }
    }
    public static void main(String[] args) {
        //通过实现类
        ILike like = new Like1();
        like.lambda();
 
        like = new Like2();
        like.lambda();
        /**
         * 局部内部类
         * 注意:要先有内部类,才能使用。
         */
        class Like3 implements ILike{
            @Override
            public void lambda(){
                System.out.println("test lambda3");
            }
        }
        like = new Like3();
        like.lambda();
 
        /**
         * 4、匿名内部类
         */
        like = new ILike() {
            @Override
            public void lambda() {
                System.out.println("test lambda4");
            }
        };
        like.lambda();
 
        /**
         * lambda 表达式
         */
        like = ()->{
            System.out.println("test lambda5");
        };
        like.lambda();
 
    }
}
 
/**
* 定义一个函数式接口
*/
interface ILike{
    void lambda();
}
 
/**
* 1、定义一个实现类
*/
class Like1 implements ILike{
 
    @Override
    public void lambda() {
        System.out.println("test lambda1");
    }
}

lambda表达式的简化

1、实体类

public class TestLambda{
    public static void main(String[] args){
        Test t = new MyTest();
        t.f("张三");
    }
}
//函数式接口
interface Test{
 	void f(String a);   
}
//实现类
class MyTest implements Test{
    @Override
    public void f(String a){
        System.out.println(a+"在测试λ表达式的简化写法。");
    }
}

2、两个参数的lambda表达式的简化,参数要加()

public class TestLambda {
    public static void main(String[] args){
        Test t = (a,b) ->System.out.println(a+"在测试λ表达式的简化写法。");
        t.f("张三","李四");
    }
}
//函数式接口
interface Test{
    void f(String a, String b);
}

3、接口方法的实现如果有个两句或者多句表达式,那么需要加{}

public class TestLambda {
    public static void main(String[] args){
        Test t = a ->{
            System.out.println(a+"在测试λ表达式的简化写法。");
            System.out.println(a+"在测试λ表达式的简化写法。");
        };
        t.f("张三");
    }
}
//函数式接口
interface Test{
    void f(String a);
}

4、一个参数的lambda表达式的简化

public class TestLambda {
    public static void main(String[] args){
        //原始的表达式写法
        Test t = (String a)->{
            System.out.println(a+"在测试λ表达式的简化写法。");
        };
        t.f("张三");
        ----------------------------------------------------
            可以将类型去掉,去掉小括号和大括号,只保留最核心的代码
        ----------------------------------------------------
        //简化后的写法 
        Test t = a->System.out.println(a+"在测试λ表达式的简化写法。");
        t.f("张三");    
    }
}
//函数式接口
interface Test{
    void f(String a);
}