为什么在java8中引入lambda表达式

时间:2014-04-16 01:37:28

标签: lambda java-8

据我所知,Java代码易于阅读且易于理解,但从我的角度来看,引入lambda表达式非常复杂。是什么让oracle认为他们将java8作为主要吸引力。
因为我我是一名java程序员,所以我想知道它为什么重要。

3 个答案:

答案 0 :(得分:3)

考虑http://docs.oracle.com/javase/tutorial/java/javaOO/lambdaexpressions.html#approach1

Lambda可用于以可读的方式制作可扩展代码 (免责声明,我实际上并不知道" Java,我在C ++中更舒服)

要从特定范围中提升功能,例如检查人员,并在满足某些条件时打印它们,Java可能以前使用对象执行此操作。

public static void printPersons(
    List<Person> roster, CheckPerson tester) {
    for (Person p : roster) {
        if (tester.test(p)) {
            p.printPerson();
        }
    }
}

interface CheckPerson {
    boolean test(Person p);
}

class CheckPersonEligibleForSelectiveService implements CheckPerson {
    public boolean test(Person p) {
        return p.gender == Person.Sex.MALE &&
            p.getAge() >= 18 &&
            p.getAge() <= 25;
    }
}

您使用的是:

printPersons(
    roster, new CheckPersonEligibleForSelectiveService());

作为一名非Java开发人员,这看起来对我来说有点傻。 Person显然是一个重要的对象,但CheckPersonCheckPersonEligibleForSelectiveService是不太有动力的课程,仅仅因为我们需要它们而存在。

感觉它们封装的重要性是具有检查功能。如果我们可以简单地通过它,我们就不需要处理类的脚手架了。哦,但看起来我们可以和lambdas一起玩!

printPersons(
    roster,
    (Person p) -> p.getGender() == Person.Sex.MALE
        && p.getAge() >= 18
        && p.getAge() <= 25
);

这段代码对我来说是超级可读的,即使我在Java 4中停止编写Java。


从技术上讲,上面的论点并不公平,因为你可以用这样的对象更紧凑地做到这一点:

printPersons(
    roster,
    new CheckPerson() {
        public boolean test(Person p) {
            return p.getGender() == Person.Sex.MALE
                && p.getAge() >= 18
                && p.getAge() <= 25;
        }
    }
);

但是,你真的需要为测试创建一个对象吗?我知道一些不好的面试问题涉及这样的匿名类的构造,所以它可能不是最直观的语法。

但重点是,如果函数是我们需要赋予代码的重要事物,我们应该有一个可以为代码提供函数的机制。这是用lambdas完成的。

答案 1 :(得分:1)

我认为这里的字是“分布式处理”。您可能已经注意到,在最近几年,如果不添加越来越多的内核,创建更快的处理器将会更加困难。

答案 2 :(得分:0)

要回答这个问题,你不应该考虑开发人员的问题。你正在考虑作为一名程序员。有什么区别?编码器是如果有人给你逻辑,你编写代码来执行逻辑。开发人员就是那个给你逻辑的人。

如果你讨厌某种语言的某些特征,那么自然倾向于远离它。但是当你独自工作时,一切都很好。如果有2个以上的开发人员,您很可能会阅读并且必须了解其他人编写的内容。如果代码是优雅地完成的并且解决了手头的问题,那么你不能只是说你不想使用它,因为你缺乏兴趣来查找文档。

EDIT 改变了最后一部分来自知识。