gpt4 book ai didi

lambda - 在 Java 8 中重用 lambda 表达式

转载 作者:行者123 更新时间:2023-12-05 01:02:42 24 4
gpt4 key购买 nike

Java 8 允许您在不同的上下文中使用相同的 lambda 表达式。考虑下面的代码来证明这一点:

   public class LambdasTypeCheck {
public static void main(String []args) {
//Same lambda expression can be used in different contexts.
Predicate<List<String>> predicate = (l) -> l.add("1");
Consumer<List<String>> consumer = (l) -> l.add("1");
}
}

lambda 表达式 (l) -> l.add("1"); 在两个地方重复。我怎样才能避免这种重复?我可以重用这个 lambda 表达式的一种方法是,如果有一些接口(interface)/类是所有 lambda 表达式的父级,这样我就可以将任何 lambda 表达式分配给这样一个接口(interface)/类的引用。

最佳答案

您没有定义您担心的是哪种“重复”。

如果是代码重复(或者说,担心故意应该相同的表达式之间可能存在不一致)困扰你,你可以使用

Predicate<List<String>> predicate = (l) -> l.add("1");
Consumer<List<String>> consumer = predicate::test;

避免它。

如果您希望 lambda 表达式真正由同一个实例表示,您可以创建一个组合 interface :

interface PredicateAndConsumer<T> extends Predicate<T>, Consumer<T> {
public default void accept(T t) { test(t); }
}

 

PredicateAndConsumer<List<String>> pAndC = (l) -> l.add("1");
Predicate<List<String>> predicate = pAndC;
Consumer<List<String>> consumer = pAndC;

所以,如您所见,您可以使用 pAndC在两种情况下,Predicate<List<String>>Consumer<List<String>>是必需的。

但是,这样做几乎没有什么好处。在这种特殊情况下,我们可以安全地假设对于大多数 JRE,引入另一个 interface 的开销是比通过一个 lambda 表达式实现它的节省要高。


您也可以考虑“Is method reference caching a good idea in Java 8? 的答案” ”。总而言之,您的示例表达式不捕获值,因此将在 Oracle 的引用实现中作为单例实现(并且可能在所有替代实现中也是如此)。所以这里我们讨论的是在运行时环境中是否创建了一个或两个不可变常量……

关于lambda - 在 Java 8 中重用 lambda 表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28545770/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com