【发布时间】:2019-06-21 09:43:57
【问题描述】:
使用 lambdas 或方法引用而不是普通的 java 方法是否有任何性能方面或其他优点?构造对象或调用方法的成本如何
我想知道传统和 Java 8 更新之间的区别
【问题讨论】:
-
方法引用比 lambda 有实际优势。
使用 lambdas 或方法引用而不是普通的 java 方法是否有任何性能方面或其他优点?构造对象或调用方法的成本如何
我想知道传统和 Java 8 更新之间的区别
【问题讨论】:
与传统的 Java 方法相比,使用 Java 8 API 有很多优势。
Java 8 基本上专注于函数式风格(更多声明式,更少命令式)方法,现在我们可以使用 Java 8 以优雅流畅的函数式风格进行编程,并具有高阶函数。这可以导致简洁的代码 错误更少,更易于理解、维护和并行化。
最重要的是:
还有很多要补充的,我只给了我的 2cents。
【讨论】:
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 比普通的方法调用要慢一些。
【讨论】:
您可以在 Google 上搜索几篇文章,但它们似乎都表明 Lambda 的性能不如 for 循环和匿名类。我不知道 Java 9 或 Java 10 是否完全提高了 lambdas 的性能,但我找不到任何似乎表明他们这样做的东西。
我认为 lambda 的主要好处是可读性。也就是说,我看到一些 lambda 代码根本不可读,所以我想它就像大多数你可以滥用它的东西一样。
【讨论】:
toString() 对Strings 列表执行myList.stream().map(item -> item.toString).collect(Collectors.toList()) to convert myList`。但是,如果您正在编写自己的 lambda,我相信您必须使用 Consumer 或其变体之一(例如 BinaryConsumer 和其他一些???)。后者我没有做太多,所以我不是 100% 确定。
我可能认为问题是关于Imperative 与Declarative 的 Java 编程。
因为 lambda/方法引用只能与匿名类的性能进行比较。
他们在执行前采取不同的步骤:
Lambda vs Anonymous Class
linkage class loading
capture instantiation
invocation invocation
总体基准测试表明,lambda 在“热”基准测试中更快一些,而在“冷”基准测试中明显更快。
关于复杂的方法和集合处理,没有像X 比Y 更快的整体性能基准。
您应该指定一个案例来比较性能基准,在某些情况下经典方法可以更快地工作,在某些情况下 - 功能。我可能会假设在大多数情况下,经典方法会运行得更快,尤其是在使用可变对象时。
但是使用函数样式以并行方式处理集合要容易得多。流是延迟执行的,这是一个优势。
Java 支持函数式编程、流和 lambda 是非常好的特性,但它们不是灵丹妙药。明智地使用它们。
【讨论】: