码迷,mamicode.com
首页 > 编程语言 > 详细

Java 8之Lambda

时间:2015-07-30 21:33:17      阅读:137      评论:0      收藏:0      [点我收藏+]

标签:java   lambda   java8   

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

为什么要Lambda

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

Lambda到底是什么

Java中,Lambda是函数接口(Functional Interface)的简写,本质是函数接口

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

这么说来,Lambda是接口,和类平级,而不是一个类里面的方法。蛮吃惊的,记得Python语言里面Lambda的别称是匿名函数,是函数,不是类啊。猜测Java这么设计为了权衡了向前兼容等因素的结果吧。

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

版权声明:本文为博主原创文章,未经博主允许不得转载。

Java 8之Lambda

标签:java   lambda   java8   

原文地址:http://blog.csdn.net/kimylrong/article/details/47154879

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!