公司内部的一些新项目相继采用了Java 8,这才有了动力好好的研究一下Java 8这个传说中的大杀器。Java 8文档里面提到的第一个改进就是Lambda,就从它入手好了。社区好多大神都已经研究几年了,拜一下。有不准确的地方,望指正。
把Java代码写得更简洁一点,更直白来说,就是写出来的代码篇幅更短。那么简单?核心来说,是的,不过可能额外带来一些好处。理论上来说,Lambda不是必需品,有了写的代码更优雅简练。Java最被诟病的问题之一就是代码量大(很多是无用的,只是语法要求这么干而已),Lambda能够给Java代码瘦瘦身。Java社区对Lambda的呼声一直很高,终于Java 8来了,项目中也陆续用起来。撒花…
Java中,Lambda是函数接口(Functional Interface)的简写,本质是函数接口。
这么说来,Lambda是接口,和类平级,而不是一个类里面的方法。蛮吃惊的,记得Python语言里面Lambda的别称是匿名函数,是函数,不是类啊。猜测Java这么设计为了权衡了向前兼容等因素的结果吧。
所以,Java中任何Lambda必定有对应的函数接口,函数接口是Lambda的类型,Lambda是函数接口的实例。函数接口需要提前声明好,Lambda在使用的时候再写。好烦啊,用Lambda还得先写函数接口?是的,不过JDK设计的时候考虑到这一点,预先给大家提供了好几个常用的函数接口,都在java.util.function包下,比如Predicate,Consumer等。
Lambda由三部分组成,参数,->,方法体
参数
(ParamType1 p1, ParamType2 p2, …)
参数类型可省,变为(p1, p2, …)
只有一个参数时括号也可省,p1
方法体
一个表达式或者一个语句块,return语句不必写
表达式会有一个计算结果
语句块用大括号括起来(可以写多条语句),只有一条语句并且函数接口的抽象方法的返回值为void时,大括号可省
public class Lambda {
public static void main(String[] args) {
List<Material> materials = new ArrayList<Material>();
materials.add(new Material());
materials.add(new Material());
materials.add(new Material());
materials.add(new Material());
materials.add(new Material());
doSomthing(materials,
(Material m) -> System.out.println("Print " + m.getId()));
}
public static void doSomthing(List<Material> materials,
FunctionalInterfaceDemo demo) {
for (Material material : materials) {
demo.print(material);
}
}
static class Material {
public static int idStore = 1;
private int id;
public Material() {
id = idStore++;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
}
static interface FunctionalInterfaceDemo {
void print(Material material);
}
}
FunctionalInterfaceDemo就是函数接口。
参数类型可以不写,刚开始时不习惯。不过JDK会在编译时推测Lambda对应的函数接口,从而知道抽象方法信息。另外注意Lambda不会生成一个新的scope(虽然有大括号),和Lambda所在的scope相同。Lambda虽然不是必需品,但也绝对不是奢侈品,其它语言都用好多年了,升到Java 8的同学用起来。
版权声明:本文为博主原创文章,未经博主允许不得转载。
原文地址:http://blog.csdn.net/kimylrong/article/details/47154879