Java 8之Lambda

来源:互联网 发布:天下网商招聘php 编辑:程序博客网 时间:2024/06/06 20:25

公司内部的一些新项目相继采用了Java 8,这才有了动力好好的研究一下Java 8这个传说中的大杀器。Java 8文档里面提到的第一个改进就是Lambda,就从它入手好了。社区好多大神都已经研究几年了,拜一下。有不准确的地方,望指正。

为什么要Lambda

把Java代码写得更简洁一点,更直白来说,就是写出来的代码篇幅更短。那么简单?核心来说,是的,不过可能额外带来一些好处。理论上来说,Lambda不是必需品,有了写的代码更优雅简练。Java最被诟病的问题之一就是代码量大(很多是无用的,只是语法要求这么干而已),Lambda能够给Java代码瘦瘦身。Java社区对Lambda的呼声一直很高,终于Java 8来了,项目中也陆续用起来。撒花…

Lambda到底是什么

Java中,Lambda是匿名方法,目的是简化函数接口(Functional Interface)的编写

  • 什么是函数接口?
    函数接口是一种特殊的接口,是只有一个抽象方法的接口
  • 什么是抽象方法?
    抽象方法是没有实现的方法,也就是方法参数后面没有跟大括号

所以,Java中任何Lambda必定有对应的函数接口,函数接口是Lambda的类型,Lambda是函数接口的实例。函数接口需要提前声明好,Lambda在使用的时候再写。好烦啊,用Lambda还得先写函数接口?是的,不过JDK设计的时候考虑到这一点,预先给大家提供了好几个常用的函数接口,都在java.util.function包下,比如Predicate,Consumer等。

Lambda语法

Lambda由三部分组成,参数,->,方法体

  • 参数
    (ParamType1 p1, ParamType2 p2, …)
    参数类型可省,变为(p1, p2, …)
    只有一个参数时括号也可省,p1

  • 方法体
    一个表达式或者一个语句块,return语句不必写
    表达式会有一个计算结果
    语句块用大括号括起来(可以写多条语句),只有一条语句并且函数接口的抽象方法的返回值为void时,大括号可省

Lambda例子

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的同学用起来。

1 0