Lambda表达式入个门

1、为什么要使用Lambda表达式

  • 避免匿名内部类定义过多
  • 可以让你的代码看起来很简洁
  • 去掉了一堆没有意义的代码,只留下核心的逻辑。

2、函数式接口

理解Functional lnterface(函数式接口)是学习Java8 lambda表达式的关键所在。

定义:任何接口,如果只包含唯一一个抽象方法,那么它就是一个函数式接口。

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

直接以Runnable接口为例,它是不是只有一个抽象方法run,那么它就是一个函数式接口,对于函数式接口,我们就可以通过Lambda表达式来创建该接口的对象。

3、Lambda表达式的推导

①、一般情况创建接口对象

Ⅰ、创建接口

/**
 * @author PengHuAnZhi
 * @createTime 2021/2/14 20:43
 * @projectName LambdaDemo
 * @className Like.java
 * @description TODO
 */
public interface Like {
    
    
    public abstract void like();
}

Ⅱ、创建接口实现类

/**
 * @author PengHuAnZhi
 * @createTime 2021/2/14 20:46
 * @projectName LambdaDemo
 * @className Ilike.java
 * @description TODO
 */
public class ILike implements Like {
    
    
    @Override
    public void like() {
    
    
        System.out.println("I like java!");
    }
}

Ⅲ、Main方法测试

/**
 * @author PengHuAnZhi
 * @createTime 2021/2/14 20:35
 * @projectName LambdaDemo
 * @className LambdaTest1.java
 * @description TODO
 */
public class LambdaTest1 {
    
    
    public static void main(String[] args) {
    
    
        ILike iLike = new ILike();
        iLike.like();
    }
}

image-20210214204841794

②、静态内部类方式创建接口对象

先创建接口类,再创建其实现类,最后再创建该实现类,这个步骤实在太多,为了少创建几个文件,直接使用静态内部类方式创建

/**
 * @author PengHuAnZhi
 * @createTime 2021/2/14 20:35
 * @projectName LambdaDemo
 * @className LambdaTest1.java
 * @description TODO
 */
public class LambdaTest1 {
    
    
    static class ILike implements Like{
    
    
        @Override
        public void like() {
    
    
            System.out.println("I like java!!");
        }
    }
    public static void main(String[] args) {
    
    
        ILike iLike = new ILike();
        iLike.like();
    }
}

image-20210214205132520

③、局部内部类方式创建接口对象

这里的实现类ILike只在一个地方使用了一次,放在全局不大合适,再将其转移到内部定义

/**
 * @author PengHuAnZhi
 * @createTime 2021/2/14 20:35
 * @projectName LambdaDemo
 * @className LambdaTest1.java
 * @description TODO
 */
public class LambdaTest1 {
    
    

    public static void main(String[] args) {
    
    
        class ILike implements Like {
    
    
            @Override
            public void like() {
    
    
                System.out.println("I like java!!!");
            }
        }
        ILike iLike = new ILike();
        iLike.like();
    }
}

image-20210214205536844

④、匿名内部类方式创建接口对象

继续优化,回想匿名内部类,没有类名称,直接借助接口我们就可以new出这个接口的实现类对象

/**
 * @author PengHuAnZhi
 * @createTime 2021/2/14 20:35
 * @projectName LambdaDemo
 * @className LambdaTest1.java
 * @description TODO
 */
public class LambdaTest1 {
    
    

    public static void main(String[] args) {
    
    
        Like like = new ILike() {
    
    
            @Override
            public void like() {
    
    
                System.out.println("I like java!!!!");
            }
        };
        like.like();
    }
}

image-20210214210254405

⑤、继续使用Lambda简化

它直接将接口中的方法声明给省略了,因为该接口中只有一个抽象方法,声明与否无关紧要

/**
 * @author PengHuAnZhi
 * @createTime 2021/2/14 20:35
 * @projectName LambdaDemo
 * @className LambdaTest1.java
 * @description TODO
 */
public class LambdaTest1 {
    
    

    public static void main(String[] args) {
    
    
        Like like = () -> {
    
    
            System.out.println("I like java!!!!!");
        };
        like.like();
    }
}

image-20210214210557144

对于方法体中只有一个打印语句,前面的大括号都还可以省略,像这样,是不是特别简洁!但是前提是方法中只有一行语句,如果有多行,还是乖乖写大括号

Like like = () -> {
    
    
    System.out.println("I like java!!!!!");
};
//转换为
Like like = () -> System.out.println("I like java!!!!!");

⑥、含参接口如何使用lambda

Ⅰ、简单修改一下Like接口

/**
 * @author PengHuAnZhi
 * @createTime 2021/2/14 20:43
 * @projectName LambdaDemo
 * @className Like.java
 * @description TODO
 */
public interface Like {
    
    
    void like(int a);
}

Ⅱ、Lambda表达式

/**
 * @author PengHuAnZhi
 * @createTime 2021/2/14 20:35
 * @projectName LambdaDemo
 * @className LambdaTest1.java
 * @description TODO
 */
public class LambdaTest1 {
    
    

    public static void main(String[] args) {
    
    
        Like like = a -> System.out.println("I like java " + a + " times!");
        like.like(1);
    }
}

image-20210214211420945

注意这个地方我的新接口Like中的方法只有一个参数,所以在使用Lambda表达式的时候,a没有打括号,如果参数不止一个,括号需要加上,如:

Like like = a -> System.out.println("I like java " + a + " times!");
//变为
Like like = (a,b) -> System.out.println("I like java " + a + b + " times!");

猜你喜欢

转载自blog.csdn.net/qq_43509535/article/details/113811192