当前位置: 首页 > 知识库问答 >
问题:

如何将lambdas用于具有多个方法的接口?

赵英资
2023-03-14

如果目标类具有多个接口方法,是否有方法使用lambdas?或者,在这种情况下,您是否只需要使用匿名内部类

共有2个答案

傅彬
2023-03-14

不可能使用lambda直接创建多方法对象。

但是,您可以使用变通方法以非常简洁的方式解决问题:

使用一个util方法,该方法将多个单方法对象作为参数,并返回一个多方法对象,单方法对象已打包到该对象中。

示例:

interface MultiMethodInterface {
    void method1();
    String method2(String arg);
}

public static void example() {
    // One lambda for each method, they are packed into a 
    // MultiMethodInterface object by the multiMethodInterface method
    MultiMethodInterface i1 = createMultiMethodObject(
            () -> System.out.println("method1"),
            arg -> "method2: " + arg);

    // Sometimes only one of the methods is used, a specialized wrapper
    // can be used if that is common
    MultiMethodInterface i2 = 
            createMethod1Wrapper(() -> System.out.println("method1"));
}

public static MultiMethodInterface createMultiMethodObject(
        Runnable methodAction1,
        Function<String, String> methodAction2)
{
    return new MultiMethodInterface() {
        @Override
        public void method1() {
            methodAction1.run();
        }
        @Override
        public String method2(String arg) {
            return methodAction2.apply(arg);
        }
    };
}

public static MultiMethodInterface createMethod1Wrapper(Runnable methodAction1) {
    return createMultiMethodObject(methodAction1, arg -> "");
}

产生的代码至少比创建匿名类要短一些,也漂亮一些。至少如果方法实现很短,和/或只有一个方法需要被实现。

例如,在SWT工具包中使用这种技术来创建侦听器对象。

索曾琪
2023-03-14

不,没有。如果我正确理解了您的问题,您可能希望使用lambdas来处理具有多个抽象方法的接口。在这种情况下,答案是否定的:

函数接口是只包含一个抽象方法的任何接口。(函数接口可能包含一个或多个默认方法或静态方法。)由于函数接口仅包含一个抽象方法,因此在实现时可以省略该方法的名称。为此,不使用匿名类表达式,而是使用lambda表达式[…]

请在上面阅读:http://docs.oracle.com/javase/tutorial/java/javaOO/lambdaexpressions.html

 类似资料:
  • 问题内容: 我想验证以下行为的方法如下。 在我的@Test类中,我希望做这样的事情来验证是否使用“ exception.message”和再次使用“ exception.detail”进行了调用 但是Mockito抱怨​​如下 我如何告诉Mockito检查两个值? 问题答案: 进一步的阅读使我尝试使用ArgumentCaptors和以下作品,尽管比我想要的更为冗长。

  • 我有一个程序,它有一个超级类,个人和子类,学生,并试图根据他们的生日和名字来比较他们什么时候是平等的。我做对了,但是在我试图解决的提示下,我得到了一个错误,自动评分器是:“测试学生和学生是一样的,即使成绩不同”,预期结果是真的,但我总是得到错误。这个程序在比较人和学生时起作用,在比较人和人时起作用,而不是学生和学生,我不知道为什么。 主要类别: 超类: 子类:

  • 我在日蚀氧气里玩Lambda我有这样的代码 我无法提取Dummy::dothingsWithTwoArgs。Eclipse显示了一个编译错误语法错误,插入“AssignmentOperator Expression”以完成表达式,但提取在intellij中工作良好。在eclipse中有没有解决这个问题的方法?

  • 问题内容: 我在接口上苦苦挣扎。考虑一下: 我希望函数返回a 或an ,具体取决于是否从或调用 当我尝试对此进行编译时,出现以下错误: 不能将s( StringGenerator类型)用作数组或切片文字中的Generator类型: StringGenerator不实现Generatorer(getValue方法的类型错误) 有getValue()字符串 要getValue() 我该如何实现? 问题

  • 我想要的:我在下面试过了,但它不起作用。