Lambda表达式的简单使用

个人看法:

        lambda表达式在《Java8实战》中想表达的是行为参数化,即从参数传递代码,但实际上还是传递的对象,从感官上来说确实是直接传递的代码,代码更加直观了,毕竟很多人不想因为一行有效代码,去编写一个类,尽管可以使用匿名内部类,但是匿名内部类可以更加简洁,那就是lambda表达式。

        lambda表达式可以粗略看做匿名内部类的语法糖,为了让编码更简洁、直观,由于它简洁到方法名、返回值类型、参数类型都可以没有的语法特点,所以需要一个接口来提供上下文的推断,满足Java能真的认识这串代码入参类型和返回值类型,可结合模板方法模式精简一些重复的“环绕代码”,官方已定义了常用的接口,这些常用的接口成了stream流中重要的承载lambda表达式代码的载体,总之stream流操作是高效代码必不可少的一块,而为此学习简洁的lambda表达式也是有必要的。

        一个只含有一个抽象方法的接口,称之为函数式接口,只含有一个抽象方法,不代表不能有其他的非抽象方法,在jdk8中已经可以给接口添加多个静态和默认方法。

  

 

 

  一个测试类,含有一个test000方法,和test111方法

 

 

      结果

 

 

可以看出,lambda表达式从观感上能直接让我们看到有效代码,确实是很简洁。

 有的人说:"这里使用了模板方法模式,完全可以不用这个模式,直接就写死就行,同样能出结果,连接口都不用,很省。“

就像这样

 

确实,但是这个例子是很简单的,如果有很多个这样的就只有判断条件不同的方法,那写死不就要复制粘贴很多个方法了吗,而且复制粘贴多少不太安全。

再者说,lambda表达式单独并不强大,主要是stream很强大,它其中的很多方法就是模板方法,我们只需要提供lambda表达式就可以使用,不使用stream,不太恰当的相当于别人用SpringBoot开发,而你用SSM写,而lambda就充当的是SpringBoot的application.yml,可以进行简洁的配置,不再需要那么多的SSM中需要的xml配置文件,因为SpringBoot帮你做好了一些事情。

 

一个含有一个抽象方法的接口,该抽象方法接受两个参数

测试类添加test333方法

 

分别调用两个方法

 

 可以看出

  1、对于一个参数的抽象方法,lambda表达式可以不写括号,而对于两个参数的,则需要括号

  2、无论参数有几个,都可以不写类型

  3、如果方法体只有一条语句,可以不加大括号,它会自动将该条语句结果返回,多于一条,则需要加大括号且加;和return

特别的,System.out::println这样的写法也是可以的,静态方法可以直接使用,或者当前流有对象的引用,则可对该对象使用其类的这种写法

比如有个对象Apple a,则a -> a.getWeight()  等效于 Apple::getWeight

posted @ 2019-12-21 12:06  darkclouds  阅读(501)  评论(0编辑  收藏  举报