欢迎进入我的博客:blog.scarlettbai.com查看更多文章
Lambda表达式是Java8里的一个重要特性,发布这么久了,最近在学swift语言时发现了其中的闭包的概念其实跟Lambda表达式极其相似,于是今天整理一下Java8中的Lambda表达式,做个介绍。
Lambda表达式其实就是提供Java编程中对于函数式编程的支持,在我们习惯了一切皆对象时,刚接触Lambda可能读起来比较费劲,但是习惯之后,其确实有助于代码的简洁,且在Python、swift等中都有类似于Lambda这种概念,未来可能大家都会用到,所以学习下还是有帮助的。
Lambda基本语法:([parameter…]) -> { statements; } //[]表可选,即括号可以无参
接下来我们通过一些实例来学习Lambda:
一:遍历
Java8在迭代器Iterable中新增了方法forEach(Consumer action),参数为一个Lambda表达式,即一个方法,接下来看下用法:
图中可以看到,以前需要3行的代码,现在可以一行解决,甚至可以更简洁,如下:
其中的::符号之前是作用域,之后是具体方法,例如Objest::hashCode,上图中也一样System.out其实是一个PrintStream对象,PrintStream对象有一个Println方法。
另外随口说一句,这个地方用到Arrays.asList()方法,大家可能经常用这个方法来返回List,但是这个地方有个要注意的地方是,Arrays.asList()返回的是java.util.Arrays的一个内部类java.util.Arrays.ArrayList,和我们平常用的java.util.ArrayList是不一样的,java.util.Arrays.ArrayList不能做add()操作,虽然编译不会报错,但是运行会报错,编译通过是因为我们指向的接口是List,List中是有add()方法的:
二:Runnable
Lambda表达式可以极大程度简化匿名内部类的代码,如下:
当然也可以简化如下:
三:Arrays排序
Arrays.sort()我们也经常会用到,我们来看下lambda表达式写的排序:
图中可以看到,lambda表达式可以在一行内完成所需功能,精简了很多代码,且习惯了以后可读性也高,这里写这个例子主要是让大家看看lambda有多个参数时的写法,至于其中的Arrays.stream()我会在后面写一篇文章专门讲它,以及它的Map、reduce、filter等方法,此处只需要知道他返回的是一个Stream对象,可以传入lambda表达式进行遍历过滤操作即可。
四:Predicate
Predicate翻译为断言,作为参数时表示此处需传入一个返回true和false的lambda表达式,我们先看其使用方法:
Predicate的test方法返回值为bool,看其源码时发现其还有and、or等方法,那么下面看一下Predicate可能的应用场景,对于一个数组做筛选操作:
上图中可以看到,filter方法传入了两个lambda表达式,分别是判断字符串长度是否大于4和是否以A结尾,在filter方法中,通过and连接,各位也可以换成or试试效果,结果返回的List中只包含所需数据。
五:其他
另外有一点需要注意的是,由于lambda表达式相当于匿名内部类,所以其中引用的外部参数需要是fina的,所以不能赋值,跟匿名内部类一样,会在编译期报错,如下:
今天就为大家带来这些lambda的基础入门,下一篇会带来Java8的新特性的stream,有问题的可以关注微信公众号后留言提出。
欢迎关注个人微信公众号: