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

Eclipse提取到不适用于Lambdas的方法

祝花蜂
2023-03-14

我在日蚀氧气里玩Lambda我有这样的代码

@FunctionalInterface
interface TriFinction<O,I,J, R> {
    R whatEver(O object, I input1, J input2);
}

class Dummy {
    public String dothingsWithTwoArgs(String a, String b) {
        return a+b;
    }
}

public class LambdaTest {
    public static void main(String[] args) {
        Dummy::dothingsWithTwoArgs;
    }
}

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

共有3个答案

简培
2023-03-14

将Lambda提取到一个方法似乎只支持Eclipse 4.23(2022年2月,6年后)

添加了一个新的内容辅助以将lambda的主体提取到方法中。
要调用新功能,请在选定的lambda主体中执行Ctrl1

南宫正阳
2023-03-14

我们应该知道的一件主要事情是编译错误消息取决于编译器。这并不意味着不同的编译器会一直产生不同的错误消息。但是可能会有一些情况。

关于你的问题,我找到了这个答案和帖子。这篇文章在主题而不是声明下详细解释了这个错误。

所以重点是这个。正如您所提到的,这个错误消息是特定于Eclipse编译器的。编译器提出的要点是,您的行只是一个表达式,而不是一个语句。为了将其理解为语句,编译器希望您添加赋值运算符。这就是插入“AssignmentOperator Expression”以完成表达式的全部含义。你们要做的就是把这一行赋给另一个定义好的变量,就像这样。

someVariable = Dummy::dothingsWithTwoArgs;

希望你能找到更多的深度和更多的例子与我提到的来源。:))

扶高歌
2023-03-14

首先请注意,dothingsWithTwoArgs不是静态的,因此不应该尝试以静态方式调用它:应该使用伪类的实例或使dothingsWithTwoArgs成为静态的

这里有一些插图可以帮助你

首先,您需要一个将TriFinction作为其参数之一的方法

示例:

public static String sumToString(String a,String b, String c, TriFinction<String,String,String,String> f) {
        return f.whatEver(a, b, c);
    }

其次,在虚拟类中,您需要一个与TriFinction的genric签名匹配的方法(例如,这意味着它接收O、J和I的三个参数,并返回R)

举个例子

public static String dothingsWithThreeArgs(String a, String b,String c) {
            return a+ " " + b + " " + c;
      }

现在,您可以在主方法中使用方法引用,例如:

System.out.println(sumToString("2","3","4",Dummy::dothingsWithThreeArgs));

这是完整的示例以及TriFinction的第二个插图(我想你应该重构并重命名为TriFunction:))

public class ExtractWithLambda {
    @FunctionalInterface
    interface TriFinction<O,I,J, R> {
        R whatEver(O object, I input1, J input2);
    }   

    public static String writeEqu(TriFinction<Double,Double,Double,String> f) {
          return f.whatEver(2.5, 3.4, 5.6);
    }

    public static String sumToString(String a,String b, String c, TriFinction<String,String,String,String> f) {
        return f.whatEver(a, b, c);
    }

    public static void main(String[] args) {
        System.out.println(writeEqu(Dummy::writeEquation)); 
        System.out.println(sumToString("2","3","4",Dummy::dothingsWithThreeArgs));
    }

}

class Dummy {
      public static String dothingsWithThreeArgs(String a, String b,String c) {
            return a+ " " + b + " " + c;
      }

      public static String writeEquation(double a, double b, double c) {
            return a + "*x*x " + b + "*x " + c ;
      }
    }
 类似资料:
  • 我下载了龙目。jar(lombok-1.16.14.jar)将其放入我的下载中。然后我点击这个jar,执行正确地识别了我的MacOS上的Eclipse实例,然后我选择了我想要的实例。pom中也规定了龙目岛。提供了xml org.projectlombok lombok 1.16.14 在eclipse.ini我得到了添加:-javaagent:... /Eclipse/lombok.jar 龙目岛

  • 我对java“I get this error”不熟悉,找不到适合getText(String)方法JTextComponent的方法。getText(int,int)不适用(实际参数列表和形式参数列表长度不同)方法JTextComponent。getText()不适用 (Alt Enter显示提示)“当我试图运行我的程序时。请帮助。我做错了什么?

  • 我想允许用户上传两个图像,封面和徽标。然后将它们保存在fi恢复中。我在行中出错 找不到适用于into(Uri)方法RequestCreator的方法。into(目标)不适用(参数不匹配;Uri无法转换为目标)方法RequestCreator。into(ImageView)不适用(参数不匹配;Uri无法转换为ImageView)

  • 在我们的代码库从java 1.7迁移到1.8的过程中,我们得到了一个错误消息“方法...不适用于几个代码位置上的参数,它们都遵循泛型用法中的相同模式。 我们目前主要在上使用(4.5.2),但也可以使用(4.6)确认行为。以及符合级别为1.7的都可以编译我们的代码而不会出错。 下面是一个最小、完整且可验证的示例: 现在,在 do 中切换注释掉的行方法会使代码编译,因此我们确实有一个解决方法。仍然错误

  • 您好,我正在尝试使用PostConstruct方法初始化字段,但在测试中,此方法不会填充bidiMap字段。 有没有办法模拟字段,它是的字段? 测试: 正在测试的类:

  • 起初,我在使用< code>writeAndFlush(...)直到我偶然发现了这个修复。现在,我已经可以使用< code>writeAndFlush(...)每个字符串都带有后缀/r/n。当我尝试发送< code>ByteBuf对象时,问题仍然存在。显然,我不能只在消息末尾添加/r/n。对此有什么解决办法吗? 如果有帮助,我将使用