【Java8新特性】- Lambda表达式

Java8新特性 - Lambda表达式

生命不息,写作不止 继续踏上学习之路,学之分享笔记 总有一天我也能像各位大佬一样 一个有梦有戏的人 @怒放吧德德分享学习心得,欢迎指正,大家一起学习成长!

【Java8新特性】- Lambda表达式

文章插图
简介Lambda 表达式(lambda expression)是一个匿名函数 , Lambda表达式基于数学中的λ演算得名,直接对应于其中的lambda抽象(lambda abstraction),即没有函数名的函数 。Lambda表达式可以表示闭包(注意和数学传统意义上的不同) 。这是来自百度百科对lambda的介绍,实际上lambda就是简化了匿名函数的编写,只需一行代码就能代替繁杂的代码 。lambda主要是可以非常简洁的形式调用我们的匿名函数接口 。
简单例子首先声明一个接口,并且编写实现类实现这个接口
// UserServicepublic interface UserService {    void add();}// UserServiceImplpublic class UserServiceImpl implements UserService {    @Override    public void add() {        System.out.println("UserServiceImpl --- add");    }}一般来说是通过new实现类从而拿到实现中的add方法 , 如果通过new接口类就需要使用匿名内部类的形式调用接口 。IDEA会提示使用lambda表达式 。
【Java8新特性】- Lambda表达式

文章插图
如下代码可以看一下对比 。
public static void main(String[] args) {    UserService userService = new UserServiceImpl();    userService.add();    UserService user = new UserService() {        @Override        public void add() {            // 匿名内部接口业务逻辑            System.out.println("匿名内部接口业务逻辑");        }    };    // Lamdba表达式    UserService user2 = () -> System.out.println("匿名内部接口业务逻辑");    user2.add();}Lambda表达式的规范Java中的Lambda表达式的规范,必须是为函数接口 。
使用函数式接口【【Java8新特性】- Lambda表达式】使用Lambda表达式依赖于函数式接口:1、使用@FunctionalInterface注解来声明函数接口2、在这个函数接口中只能有一个抽象方法3、在函数接口中可以定义object类中的方法4、可以有静态方法*函数式接口(Functional Interface) 就是一个有且仅有一个抽象方法,但是可以有多个非抽象方法的接口 。更多函数式接口可以查看菜鸟联盟:https://www.runoob.com/java/java8-functional-interfaces.html
函数式接口的定义通过@FunctionalInterface注解声明接口类 , 在java中也有许多内置的函数接口 , 详情看菜鸟联盟 。
@FunctionalInterface // 声明函数式接口public interface UserService {    void add();    String toString(); // Object类中的方法    static void hello() { // 静态方法        System.out.println("hello");    }}Lambda表达式的基础语法表达式格式(参数) -> {方法体}
格式说明():存放参数,留空就代表没有参数 。函数接口的参数列表,不需要写类型 , 需要定义参数名称 。->:是新引入的语法格式 , 代表指向动作 。{}:方法体
无参方法调用在接口类中声明一个无参的抽象方法 , 通过lambda表达式来完成调用 。()不需要存放参数,最后将会返回一个实现类对象 。在通过调用对象的get方法 。
// 匿名内部接口业务逻辑UserService user2 = () -> System.out.println("匿名内部接口业务逻辑");user2.get();更加简便的写法
((UserService)() -> System.out.println("匿名内部接口业务逻辑")).get();含参数方法调用在MathService定义一个含有参数的抽象方法,原本的方式通过匿名内部接口 。可以通过使用lambda表达式更加简便,并且可以省去{},也不需要return 。

推荐阅读