Java 8 lambda 表达式与只有一个方法的抽象类[重复]

2024-04-02

我正在学习 Java 8 中的 lambda 表达式。有人可以向我解释如何将 lambda 表达式与只有一种方法的抽象类一起使用(如果可能的话)?

例如,这是抽象类:

public abstract class ClassA {

    public abstract void action();

}

我还有另一个类,它的构造函数中包含一个实例ClassA:

public ClassB {
   public ClassB(String text, ClassA a){
      //Do stuff
    }
}

所以我想知道如何写这样的东西:

ClassB b = new ClassB("Example", new ClassA(() -> System.out.println("Hello")));

显然这个语句不起作用,但是有没有办法在这里使用 lambda 表达式?如果有的话,我做错了什么?


不,你无法实现这一目标,因为ClassA必须是一个功能接口。函数式接口是只包含一个抽象方法的接口。除了抽象方法之外,它还可以包含零个或多个默认方法和/或静态方法。由于函数式接口仅包含一个抽象方法,因此在使用 lambda 表达式实现该方法时可以省略该方法的名称。例如,考虑以下接口:

interface Predicate<T> {
    boolean test(T t);
}

该接口的目的是提供对类的对象进行操作的方法T并返回一个boolean。您可以有一个方法,该方法采用实现此接口的类实例,定义如下:

public void printImportantData(ArrayList<Data> dataList, Predicate<Data> p) {
    for (Data d : dataList) {
        if (p.test(d)) {
            System.out.println(d);
        }
    }
}

where Data类可以很简单:

public class Data {
    public int value;
}

现在,您可以按如下方式调用上述方法:

 printImportantData(al, (Data d) -> { return d.value > 1; }); 

请注意,这里的方法没有名称。这是可能的,因为接口只有一个抽象方法,因此编译器可以找出名称。这可以缩短为:

printImportantData(al, (Data d) -> d.value > 1);

请注意,这里没有大括号,也没有 return 关键字。这是可能的,因为该方法返回一个布尔值并且表达式d.value > 1也返回一个布尔值。因此,编译器能够确定该表达式的值将从该方法返回。这可以进一步缩短为:

printImportantData(al, d -> d.value > 1);

请注意,没有类型声明d!编译器可以计算出它需要的所有信息,因为接口只有一个抽象方法,并且该方法只有一个参数。因此,您不需要在代码中编写所有这些内容。
将上述方法与使用内部类的旧 Java 7 风格进行比较,该内部类可以有效地执行相同的操作:

printImportantData(al, new Predicate<Data>() {
    public boolean test(Data d) {
        return d.value > 1;
    }
});
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java 8 lambda 表达式与只有一个方法的抽象类[重复] 的相关文章

  • Eclipse 在源代码管理中保存操作

    我们希望找到一种在签入之前执行代码标准的 轻量级 方法 我们真的很喜欢使用 Eclipse 内置的想法保存操作 go to Preferences gt gt Java gt gt Editor gt gt Save Actions 其中有
  • org.apache.sling.api.resource,version=[2.3,3) -- 无法解析

    您好 我无法访问我的项目内容 我已经上传了从 CQ 访问内容所需的所有包 我唯一能看到的是 org apache sling api resource version 2 3 3 无法解析 这是否是异常的原因 如果是 请告诉我如何解决 中Q
  • 正则表达式拆分数字和字母组,不带空格

    如果我有一个像 11E12C108N 这样的字符串 它是字母组和数字组的串联 如何在中间没有分隔符空格字符的情况下分割它们 例如 我希望分割结果为 tokens 0 11 tokens 1 E tokens 2 12 tokens 3 C
  • JAVA - Xuggler - 组合 MP3 音频文件和 MP4 电影时播放视频

    使用 JAVA 和 Xuggler 以下代码组合 MP3 音频文件和 MP4 电影文件并输出组合的 mp4 文件 我希望在合并音频和视频文件时应自动播放输出视频文件 String inputVideoFilePath in mp4 Stri
  • java中如何连接字符串

    这是我的字符串连接代码 StringSecret java public class StringSecret public static void main String args String s new String abc s co
  • 运行具有外部依赖项的 Scala 脚本

    我在 Users joe scala lib 下有以下 jar commons codec 1 4 jar httpclient 4 1 1 jar httpcore 4 1 jar commons logging 1 1 1 jar ht
  • 当从服务类中调用时,Spring @Transactional 不适用于带注释的方法

    在下面的代码中 当方法内部 是从内部调用的方法外部 应该在交易范围内 但事实并非如此 但当方法内部 直接从调用我的控制器class 它受到事务的约束 有什么解释吗 这是控制器类 Controller public class MyContr
  • 使用 AES SecretKey 的 Java KeyStore setEntry()

    我目前正在 Java 中开发一个密钥处理类 特别是使用 KeyStore 我正在尝试使用 AES 实例生成 SecretKey 然后使用 setEntry 方法将其放入 KeyStore 中 我已经包含了代码的相关部分 The KS Obj
  • hibernate锁等待超时超时;

    我正在使用 Hibernate 尝试模拟对数据库中同一行的 2 个并发更新 编辑 我将 em1 getTransaction commit 移至 em1 flush 之后我没有收到任何 StaleObjectException 两个事务已成
  • 如何使用 Maven 打包并运行具有依赖项的简单命令行应用程序?

    我对 java 和 Maven 都是全新的 所以这可能非常简单 如果我遵循maven2hello world此处的说明 http maven apache org guides getting started maven in Five m
  • 具有 java XSLT 扩展的数组

    我正在尝试使用 java 在 XSLT 扩展中使用数组 我收到以下错误 Caused by java lang ClassCastException org apache xpath objects XObject cannot be ca
  • 以编程方式在java的resources/source文件夹中创建文件?

    我有两个资源文件夹 src 这是我的 java 文件 资源 这是我的资源文件 图像 properties 组织在文件夹 包 中 有没有办法以编程方式在该资源文件夹中添加另一个 properties 文件 我尝试过这样的事情 public s
  • 如何知道抛出了哪个异常

    我正在对我们的代码库进行审查 有很多这样的陈述 try doSomething catch Exception e 但我想要一种方法来知道 doSomething 抛出了哪个异常 在 doSomething 的实现中没有 throw 语句
  • 在 Spring 中重构这个的最佳方法?

    private final ExecutorService executorParsers Executors newFixedThreadPool 10 public void parse List
  • 测试弱引用

    在 Java 中测试弱引用的正确方法是什么 我最初的想法是执行以下操作 public class WeakReferenceTest public class Target private String value public Targe
  • Netty:阻止调用以获取连接的服务器通道?

    呼吁ServerBootstrap bind 返回一个Channel但这不是在Connected状态 因此不能用于写入客户端 Netty 文档中的所有示例都显示写入Channel从它的ChannelHandler的事件如channelCon
  • 游戏内的java.awt.Robot?

    我正在尝试使用下面的代码来模拟击键 当我打开记事本时 它工作正常 但当我打开我想使用它的游戏时 它没有执行任何操作 所以按键似乎不起作用 我尝试模拟鼠标移动和点击 这些动作确实有效 有谁知道如何解决这个问题 我发现这个问题 如何在游戏中使用
  • 具有特定参数的 Spring AOP 切入点

    我需要创建一个我觉得很难描述的方面 所以让我指出一下想法 com x y 包 或任何子包 中的任何方法 一个方法参数是接口 javax portlet PortletRequest 的实现 该方法中可能有更多参数 它们可以是任何顺序 我需要
  • 调整添加的绘制组件的大小和奇怪的摆动行为

    这个问题困扰了我好几天 我正在制作一个特殊的绘画程序 我制作了一个 JPanel 并添加了使用 Paint 方法绘制的自定义 jComponent 问题是 每当我调整窗口大小时 所有添加的组件都会 消失 或者只是不绘制 因此我最终会得到一个
  • 带有 Maven Wrapper 的 Java 17 导致无法识别的 VM 选项“MaxPermSize=512m”

    I use OpenJDK 17 https jdk java net 17 使用 Maven Wrapper 3 8 2 从春季初始化 https start spring io Maven项目 JAR打包 Java 17 Spring

随机推荐

  • 接口是否位于继承链中?

    网上有两种说法Interface 那是陈述A 接口不属于继承链 其他声明B 接口可以继承其他接口 http msdn microsoft com en us library ms173156 28v vs 80 29 aspx 这两种说法是
  • NodeJS应用程序出现内存泄漏,它在哪里?

    我有一个 NodeJs 应用程序 它通过 Redis 服务器上的订阅来侦听消息 它会收集 5 秒的消息 然后将它们推送到连接的客户端 代码如下所示 io sockets on connection function socket nClie
  • 在 TypeScript 中实现接口原型

    我创建了一个TypeScript我的服务结果界面 现在我想为里面的两个函数定义一个基本功能 问题是我收到错误 Support 类型的值不存在属性 ServiceResult I use WebStorm为发展 VS2012让我紧张 因为大型
  • 如何合并两个数据框?

    我有一个初始数据框D 我从中提取两个数据帧 如下所示 A D D label k B D D label k 我想结合A and B到一个数据帧中 数据的顺序并不重要 然而 当我们采样时A and B from D 他们保留索引D 已弃用
  • 迭代 python 列表的最佳方法是什么,排除某些值并打印结果

    我是 python 新手 有一个问题 我检查过类似的问题 检查了教程深入Python 检查了 python 文档 googlebinging 类似的 Stack Overflow 问题和十几个其他教程 我有一段 Python 代码 用于读取
  • 创建 GSON 对象

    如何使用 Google Gson 创建 json 对象 以下代码创建一个 json 对象 如下所示 name john JsonObject jsonObject new JsonObject jsonObject addProperty
  • Varnish hit-for-pass 是什么意思?

    Varnish 版本 3 有一些用于不同操作的对象 例如 当它必须从后端检索数据时使用pass 当它在缓存中找到请求内容时使用hit 但我无法理解 hit for pass 的用法 Varnish什么时候使用它 我在网上没有找到任何有用的材
  • 当文件被删除并再次创建时,inotify 停止监视文件

    我在使用inotify时遇到一些问题 我使用 inotify 来监视文件的更改 这是我的代码 int fd inotify init int wd inotify add watch fd root temp IN ALL EVENTS i
  • 用于将 XML 内容解析为类的 LINQ 查询

    我有一个 xml 我试图通过 LINQ 查询从中提取一些信息 xml 文件的格式如下所示
  • 如何使用 pandas 中的自定义权重计算滚动平均值?

    熊猫文档http pandas pydata org pandas docs stable computation html http pandas pydata org pandas docs stable computation htm
  • 如何使用 .gitignore 忽略文件夹中的所有子文件夹

    我在 Git 中有一个文件夹 里面有一些文件 文件是我的 Git 存储库的一部分 运行我的项目时 一些工作目录会出现在该文件夹中 目录可以具有任何名称和任何具有多个子目录的嵌套级别 我想忽略此文件夹中出现的所有可能的子目录 但仍将所有文件
  • 如果密钥不存在,如何插入到 DynamoDb

    我想将 id 一些值添加到 DynamoDb 一次 如果 id 已经存在 则不执行任何操作或更新 我可以和 search if not found gt insert if found gt do nothing or update for
  • STL 迭代器对结束(过去的结束)迭代器重新验证?

    请参阅有关尾后迭代器失效的相关问题 this https stackoverflow com questions 11350454 past the end iterator invalidation in c11 this https s
  • 根据区域设置的数字格式(逗号分隔)

    我需要显示一个数值 例如123456789 905采用以下格式123 456 789 90 但逗号分隔会根据手机中选择的区域设置而变化 就好像美国英语选择的逗号分隔是 3 个位置 如果选择印度英语 则就像12 34 56 789 90 我怎
  • 我可以删除 jQuery UI 选项卡的整个样式而不破坏其他 UI 组件的样式吗? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我想完全自定义 jQuery UI 选项卡而不破坏 jQuery UI 日期选择器的样式 这是可行的还是我应该进行自定义工作而不使用
  • 我可以在自定义域中使用通配符子域吗?

    只是检查一下是否有人知道这是否可能 我想在 firebase 托管中使用通配符子域 并使用函数来解析子域 不可以 Firebase Hosting 目前不支持通配符子域 这是我们将来想做的事情 但目前没有时间表或具体计划可以分享
  • React 流程图库 [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我需要一个流程图库 它可以帮助我在 React 中创建如下所示的流程图 如果添加类似演示的链接 我将非常
  • 由于空对象引用,无法将新对象添加到 RealmList

    我必须领域对象 一个是带有两个字符串和一个布尔值的基本 RealmObject 另一个只是该对象的 RealmList 以便于访问 当我尝试从 ContactBook 实例获取列表并添加新对象时 我尝试在空对象引用上调用虚拟方法 但是 我能
  • 无法绑定到“for”,因为它不是已知的本机属性 angular2

    我必须动态创建一个复选框列表 因此我使用 ngFor 来迭代对象数组 直到迭代为止一切正常 当我设置值时出现问题forlabel标签中的属性 角度抛出错误 无法绑定到 for 因为它不是已知的本机属性 angular2 新的错误消息 未处理
  • Java 8 lambda 表达式与只有一个方法的抽象类[重复]

    这个问题在这里已经有答案了 我正在学习 Java 8 中的 lambda 表达式 有人可以向我解释如何将 lambda 表达式与只有一种方法的抽象类一起使用 如果可能的话 例如 这是抽象类 public abstract class Cla