用于传递和调用方法引用的 Lambda 语法

2024-02-08

是什么用于传递和调用方法引用的 Lambda 语法?

场景:根据值构建对象(单选按钮)Enum http://docs.oracle.com/javase/tutorial/java/javaOO/enum.html.

我传递了枚举值的集合。我希望另一个方法(构造函数)对每个枚举值调用一个方法。该方法调用确定每个单选按钮显示的标签。

但该方法的名称因每个特定的 Enum 类而异。一些枚举有一个getTitle方法,另一个可能有一个名为getDescription or getCaption,还有一个可能有getLocalizedVariationOfTitle。如何让每个调用程序员传递要调用的特定方法?

Collection<SomeEnum> enumValues = Arrays.asList( SomeEnum.values() );
x = new EnumRadioButtons( enumValues , ??methodReferenceToGetTitle?? );

传递和调用的语法,??methodReferenceToGetTitle??我不明白。构造函数看起来像这样:

public EnumRadioButtons ( Collection<?> options , ??methodReferenceToGetTitle?? ) {
    …
    for ( Object option : options ) {
        this.setTitleOfEachOption( option , ??methodReferenceToGetTitle?? );
    }
}

当方法引用被取消引用时,代码实际上变为:

this.setTitleOfEachOption( option , option.getTitle() );  // Pass the radio button item, and its label text.

or:

this.setTitleOfEachOption( option , option.getDescription() );

or:

this.setTitleOfEachOption( option , option.getSomeLocalizedVariationOfTitle() );

我尝试通过MyEnum::getTitle对于一个名为MyEnum确实有一个方法getTitle()。但我收到编译器错误。

我有预感这个答案可能会使用Supplier http://docs.oracle.com/javase/8/docs/api/java/util/function/Supplier.html:

public EnumRadioButtons ( Collection<?> options , java.util.function.Supplier<String> supplierOfTitle ) {
    super( caption , options );
    for ( Object option : options ) {
        this.setTitleOfEachOption( option , supplierOfTitle.get() );
    }
}

作为解决方法,我可以要求每个枚举实现一个接口TitleGetable例如:

public interface TitleGetable
{
    public String getTitle ();
}

但是让所有调用程序员都携带并显式实现这个额外的接口似乎很愚蠢。鉴于这是一个仅返回字符串的方法,看起来它需要一个简单的 Lambda 语法。


当您希望用户能够使用 lambda 语法时,您所要做的就是采用一个参数,该参数是一个仅具有一个抽象函数的接口。
调用者决定使用方法引用,即带有以下内容的 lambda
() -> 样式或只是像常规的 java 8 之前的接口一样实现接口。为了方便起见,java.util.function 中有几个预定义的函数。

为了获得更好的类型安全性,最好使用泛型而不是原始集合。

这将是一个定义。

class EnumRadioButtons<T> {

    public EnumRadioButtons(Collection<T> options, Function<T,String> f ) {
        for (T option : options) {
            this.setTitleOfEachOption(option, f.apply(option));
        }
    }

    public void setTitleOfEachOption(T option, String title) {
          System.out.println("DEBUG - Setting title of option: " + option  + " to have title of: " + title );
    }
}

例如,可以与此枚举一起使用:

enum MyEnum {
    A,B,C;

    public String myToString() {
        return toString();
    }
}

…和这个main方法类:

class User {
    public static void main(String[] args) {

        EnumRadioButtons<MyEnum> bts 
                = new EnumRadioButtons<>(Arrays.asList(MyEnum.values()),
                        MyEnum::myToString); // user of method reference
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

用于传递和调用方法引用的 Lambda 语法 的相关文章

  • 如何打印JTable中选定的行

    我尝试使用主 JTable 的选定行和相同的头和单元格渲染来创建临时 JTable 但是当我尝试打印它时 我只得到一个带有线边框的空矩形 我在如何打印 JTable 的特定行 列 https stackoverflow com questi
  • 配置 Eclipse 将 App Engine 类预先捆绑到单个 JAR 中以加快预热速度

    在与另一家同样使用 App Engine 的公司的同事进行讨论后 他告诉我 他通过以下步骤成功地将应用程序预热时间从约 15 秒缩短到约 5 秒 配置 Eclipse 将编译过程中生成的类捆绑到单个 JAR 文件中 配置 Eclipse 以
  • Java 8 可选

    我想检查特定对象大小是否大于 0 如果它大于 0 那么我想创建一个可选对象 如果不是 那么我想返回一个可选的空对象 这是java代码的长版本 if fooA size gt 0 return Optional of new Foo else
  • import java 导入错误:没有名为 java 的模块

    我似乎遇到了障碍 根本无法解决这个问题 任何人都可以帮我弄清楚为什么我无法导入 java 模块吗 Error Traceback most recent call last File datasource config py line 3
  • 如何知道内存中是否已经存在类的实例?

    如何知道内存中是否已经存在类的实例 我的问题是 如果存在类实例 则不想读取方法 这是我的代码 private void jButton java awt event ActionEvent evt PNLSpcMaster pnlSpc n
  • 图像在 3D 空间中绕 Y 轴旋转

    我有一个 BufferedImage 我想用 theta 角而不是仿射变换绕 Java 中的 Y 轴旋转图像 图片 旋转将如下图所示 矩形将是图像 我可以通过旋转图像的每个像素并绘制图像来做到这一点 因为我必须旋转很多图像 所以我认为这不是
  • 如何在 Android 中签署 AAR Artifacts?

    我目前正在开发一个 AAR android 库 我想用我自己的密钥对已发布的工件进行签名 以便我可以确定我是否发布了具有相同名称和功能的假 aar 注意事项1 我希望能够以编程方式检查我的库的真实性 即使是一个伪造的库 只是伪造了我的 aa
  • TableModel setCellEditable 并自动将值设置回 false

    我目前正在尝试在 JTable 中实现 JPopupMenu 它允许解锁单元格以进行编辑 Override public void actionPerformed ActionEvent e if e getActionCommand Un
  • 如何使用Gson将JSONArray转换为List?

    在我的 Android 项目中 我试图将收到的 JSONArray 转换为列表 在 的帮助下这个答案 https stackoverflow com questions 8371274 how to parse json array in
  • 如何防止我的 servlet 被其他网站调用

    好的 我有一个像这样的简单的 servlet public class SimpleServlet extends HttpServlet public void doPost HttpServletRequest req HttpServ
  • 覆盖乔达一周的第一天?

    是否有可能覆盖乔达弱的第一天sunday 因为 Joda 使用Monday作为一周的第一天 如果有办法的话 谁能解释一下 我在 SOF 中提到了以下主题 乔达时间 一周的第一天 https stackoverflow com questio
  • 如何在不冒 StackOverflowError 风险的情况下使用 CompletableFuture?

    我想遍历异步函数的搜索空间 我将逻辑编码如下 Assuming that a function maps a range of inputs to the same output value minimizes the input valu
  • java多线程中“私有最终对象”锁定有什么用?

    java多线程中 私有最终对象 锁定有什么用 据我的理解 我认为要使一个类成为线程安全的 我们应该使用内部锁定 将所有方法标记为同步并使用 this 将它们锁定在对象的监视器上 或者我们可以用方法中的私有最终对象锁替换类的 this 上标记
  • 错误包括 bouncycastle 提供商

    我需要使用bouncycastle provider我的项目中的库 我已将其包含在 gradle 项目中 apply plugin application sourceCompatibility 1 6 version 1 0 0 main
  • org.apache.poi 中的异常

    我试图编写一个可以读取和写入的程序 xlsx文件中 下面提供的代码旨在能够编写其第一个 Excel 程序 package excel reader import java io FileOutputStream import java io
  • 将序列化数据发送到 servlet 时出现 java.io.EOFException

    我正在尝试从 Java 本地应用程序上传一个包含文件到服务器的对象 我的计划是 在 tomcat 上运行的 servlet 将使用以下方法获取对象ObjectInputStream in the doGet方法 但我得到一个EOFExcep
  • 在Android项目中引用(纯java)项目(找不到类)

    我试图在我的 Android 项目中引用一个纯 java 项目 gt Java 项目有一大堆我需要使用的类 哦 正如第一个回复所指出的 我正在使用 eclipse 是的 唯一的问题是 我总是找不到类 XXX 从方法 com example
  • jasper 报告文件中出现错误

    首先 我在 iReport 5 1 0 中创建一个 R D1 jrxml 文件 我执行该报告的 Java 代码如下所示 import java sql Connection import java sql DriverManager imp
  • 使用 SimpleDateFormat、Java 进行错误的日期解析

    我需要使用日期模式 yyyy MM dd 解析输入字符串中的日期 如果日期采用任何其他格式 则抛出错误 这是我解析日期的代码 private void validateDate throws MyException Date parsedD
  • 优雅地避免 Java 中的 NullPointerException

    考虑这一行 if object getAttribute someAttr equals true 显然这一行是一个潜在的错误 属性可能是null我们会得到一个NullPointerException 因此我们需要将其重构为以下两个选择之一

随机推荐

  • 算术运算的右侧必须是“any”、“number”或枚举类型

    我在 JS 中有这段代码 我需要让它在 TypeScript 中工作 它一直在说 算术运算的右侧必须是 any number 或枚举类型 sort field reverse primer var key primer function x
  • 使用 jQuery 防止第二个按钮单击

    我的页面上有一个按钮 如果用户第二次单击该按钮 我不想执行任何操作 我有以下代码 但它不起作用 有人可以帮忙吗 myButton click function var count 0 count alert button if count
  • C 有跨平台文件 IO/路径 util 库吗?

    是否有一些 C 库可以实现与平台无关的路径操作版本 我想到的一些例子 从相对路径获取绝对路径 不需要文件存在 确保目录存在 创建一个文件 如果不存在 以及给定路径中缺少的任何目录 连接路径 获取路径的目录部分 获取路径的文件名部分 还有很多
  • 如何在 Octave 中声明符号矩阵?

    在 MatLab 中 您可以非常轻松地声明符号 syms a b mat a b 但是 当我尝试在 Octave 中复制此内容时 出现错误 这是我正在使用的代码 gt symbols gt a sym a a a gt b sym b b
  • 如何强制 Instagram 在 Safari 而不是应用内浏览器中打开链接

    Instagram 添加了一个应用内浏览器 打开链接时会自动使用该浏览器 我的网站需要在普通浏览器中打开 例如 Safari 适用于 iPhone 我试图弄清楚如何强制它重定向到正确的浏览器 如果通过 Instagram 浏览器打开此链接
  • RxJava/RxAndroid 检查互联网连接是否可用

    我有这个代码来检查互联网连接是否可用 public static boolean isOnline Runtime runtime Runtime getRuntime try Process ipProcess runtime exec
  • Pytest 可以在预先安排的时间运行吗?

    我正在使用 pytest 使用 python3 脚本运行我的测试 如下所示 pytest s test file py tee a myoutput log 有用 现在我想在每天的特定时间运行它 我尝试从 Linux 控制台 crontab
  • 类型错误:无法将序列乘以 float 类型的非 int

    我试图把float and int在我的编码中 但它仍然说 不能将序列乘以非 int 类型float PV input investment amout r float input rate n int input year FV cont
  • Gradle:找不到提供的方法()

    这是首选 https virgo47 wordpress com 2015 05 13 why gradle doesnt provide provided provided or provided group这是哪里有记录的 https
  • 如何更改文本区域中的字体颜色

    现在我有一个文本区域 可以从字符串中获取文本 我将文本区域的背景颜色设置为黑色 但是默认文本颜色为黑色 因此在突出显示它之前您看不到它 我似乎无法找到将字体颜色更改为白色的方法 CSS 有没有一种简单的方法可以做到这一点 html div
  • XPC 在工作区中的两个可可应用程序之间,NSXPCConnection 立即失效

    我有两个 Cocoa 应用程序 一个将成为此 XPC 关系中的发送者 另一个将成为接收者 In the applicationDidFinishLaunching在发送方中 我首先打开第二个接收方应用程序 NSError error nil
  • Android 在 Fling 上获取 Mapview 停止动画

    我需要限制用户可以在地图视图中导航到的区域 除非他们会看到空白屏幕 我创建了一个扩展地图视图并覆盖 onTouchEvent 的类 我正在检测 ACTION UP 操作并检查此处的坐标 并在必要时重新定位地图 一切正常 直到用户 扔 地图
  • 如何将功能区按钮连接到 Excel 加载项中定义的函数?

    我正在使用 MSVS 2013 创建 C MS Excel 加载项 在以前的外接程序范例中 功能区类设计器直接将功能区按钮单击事件连接到外接程序应用程序类中的功能 现在功能区功能在功能区类本身中定义 从单独的功能区控件类访问 ThisAdd
  • 当客户端和服务器位于同一台计算机上时,Kerberos 身份验证不运行

    当尝试从运行 jboss 服务器的同一台计算机访问应用程序时 出现以下错误 org springframework security authentication BadCredentialsException Kerberos valid
  • htaccess 301 重定向整个网站,但有例外

    我正在尝试创建一个 htaccess 文件来重定向我的整个网站 除了一些例外 但我无法让它工作 我需要重定向整个内容 提供特定的重定向 并排除两个页面 以下是我的非工作示例 谢谢 RewriteCond REQUEST URI events
  • 在 PyCharm 中运行 odoo 项目

    让我的脚接触 PyCharm 我有一个项目 它是 Odoo 14 模块 PyCharm 已为我的项目建立索引 它指示错误 警告和拼写错误 好的 现在我想运行我的 Odoo 来看看我的项目做了什么 我假设我应该通过 GUI 中的某个按钮来执行
  • 使用 Xcode 调试 Maya 插件

    我正在尝试使用 Xcode 4 6 3 调试功能调试为 Maya 2013 构建的 Maya 插件 我希望能够设置断点并通过插件进行跟踪 但我无法设置 Xcode 进行 Maya 调试 在 编辑方案 部分中 我将可执行文件设置为 Maya
  • 通过减小实体大小来提高 App Engine 性能

    目的是减少经常运行且每次必须 db get 数百个键的代码的 CPU 成本和响应时间 这还管用吗 我可以预期具有数百个键的 db get 的 API 时间吗 当我减小实体的大小时大致线性地减小 目前该实体附加了以下数据 9 String 9
  • Yii 按日期从 到 条件搜索表单

    我尝试创建搜索表单来按日期 从 到条件列出数据库中的数据 我是 Yii 初学者 我的任务是 我有型号 public from date public to date Rules public function rules return ar
  • 用于传递和调用方法引用的 Lambda 语法

    是什么用于传递和调用方法引用的 Lambda 语法 场景 根据值构建对象 单选按钮 Enum http docs oracle com javase tutorial java javaOO enum html 我传递了枚举值的集合 我希望