【问题标题】:Lambdas and Method References Over Normal Java methods in a Class [closed]类中普通 Java 方法的 Lambda 和方法引用 [关闭]
【发布时间】:2019-06-21 09:43:57
【问题描述】:

使用 lambdas 或方法引用而不是普通的 java 方法是否有任何性能方面或其他优点?构造对象或调用方法的成本如何

我想知道传统和 Java 8 更新之间的区别

【问题讨论】:

标签: java java-8


【解决方案1】:

与传统的 Java 方法相比,使用 Java 8 API 有很多优势。

Java 8 基本上专注于函数式风格(更多声明式,更少命令式)方法,现在我们可以使用 Java 8 以优雅流畅的函数式风格进行编程,并具有高阶函数。这可以导致简洁的代码 错误更少,更易于理解、维护和并行化。

最重要的是:

  1. 支持不变性
  2. 减少副作用
  3. 首选表达式而不是语句
  4. 延迟执行

还有很多要补充的,我只给了我的 2cents。

【讨论】:

    【解决方案2】:

    Java 引入了字节码指令invokedynamic 来构造匿名类,然后引入generate byte code 来构造lambdas所以,如果是 lambdas,java 会在运行时生成实现类并生成字节码。生成字节码后,其余步骤与普通方法调用相同。因此,在 lambda/method ref 的情况下,only overhead is constructing an anonymous class and generate its byte at runtime。所以 lambdas 比普通的方法调用要慢一些。

    【讨论】:

    • @shyamsanju 可以解释一下你的问题。
    • 我们可以用任何 java 8 更新的 api 代替编写传统方法吗
    【解决方案3】:

    您可以在 Google 上搜索几篇文章,但它们似乎都表明 Lambda 的性能不如 for 循环和匿名类。我不知道 Java 9 或 Java 10 是否完全提高了 lambdas 的性能,但我找不到任何似乎表明他们这样做的东西。

    我认为 lambda 的主要好处是可读性。也就是说,我看到一些 lambda 代码根本不可读,所以我想它就像大多数你可以滥用它的东西一样。

    【讨论】:

    • 我们是否需要消费者或供应商而不是普通的 java 方法
    • 要使用 lambda,不。例如,我可以使用toString()Strings 列表执行myList.stream().map(item -> item.toString).collect(Collectors.toList()) to convert myList`。但是,如果您正在编写自己的 lambda,我相信您必须使用 Consumer 或其变体之一(例如 BinaryConsumer 和其他一些???)。后者我没有做太多,所以我不是 100% 确定。
    【解决方案4】:

    我可能认为问题是关于ImperativeDeclarative 的 Java 编程。

    因为 lambda/方法引用只能与匿名类的性能进行比较。

    他们在执行前采取不同的步骤:

    Lambda      vs    Anonymous Class
    linkage           class loading
    capture           instantiation
    invocation        invocation
    

    总体基准测试表明,lambda 在“热”基准测试中更快一些,而在“冷”基准测试中明显更快。

    关于复杂的方法和集合处理,没有像XY 更快的整体性能基准。

    您应该指定一个案例来比较性能基准,在某些情况下经典方法可以更快地工作,在某些情况下 - 功能。我可能会假设在大多数情况下,经典方法会运行得更快,尤其是在使用可变对象时。

    但是使用函数样式以并行方式处理集合要容易得多。流是延迟执行的,这是一个优势。

    Java 支持函数式编程、流和 lambda 是非常好的特性,但它们不是灵丹妙药。明智地使用它们。

    【讨论】:

    • Lambda vs Anonymous Class,是不是互惠互利?
    • @Common Man 它们对于程序员来说是概念上的关系,但它们的处理方式不同,而是编译器。
    猜你喜欢
    • 1970-01-01
    • 2019-05-30
    • 2013-04-21
    • 1970-01-01
    • 1970-01-01
    • 2020-10-30
    • 1970-01-01
    • 1970-01-01
    • 2016-09-21
    相关资源
    最近更新 更多