【问题标题】:Eclipse extract to method not working for LambdasEclipse 提取到方法不适用于 Lambda
【发布时间】:2022-02-26 06:39:34
【问题描述】:

我在日食氧气中使用 lambdas。我有这样的代码

@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 中是否有任何解决方法?

【问题讨论】:

    标签: java eclipse intellij-idea lambda


    【解决方案1】:

    首先请注意,您的 dothingsWithTwoArgs 不是静态的,因此您不应该尝试以静态方式调用它:您应该使用 Dummy 类的实例或创建 dothingsWithTwoArgs强>静态

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

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

    例子:

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

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

    例如

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

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

    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 ;
          }
        }
    

    【讨论】:

    • 感谢您的回复。我不希望代码能够正常工作。我只需要知道为什么 Eclipse 没有将其提取到变量中。当我在 intellij 中执行 ctrl+shift+l 时,它会将其提取到“TriFinction dothingsWithTwoArgs = Dummy::dothingsWithTwoArgs;”。我认为方法参考也适用于非静态方法。例如 String::toLowerCase
    【解决方案2】:

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

    关于您的问题,我发现了 answerpost。该帖子在 not a statement 主题下详细解释了此错误。

    所以重点是这个。正如您所提到的,此错误消息是特定 Eclipse 编译器。编译器提出的要点是您的行只是一个表达式不是语句。为了将其理解为语句,编译器希望您添加 赋值 运算符。这就是insert "AssignmentOperator Expression" to complete Expression 的全部含义。所以你们都想做的只是将该行分配给另一个定义的变量,看起来像这样。

    someVariable = Dummy::dothingsWithTwoArgs;
    

    希望您可以通过我提到的来源找到更多深度和更多示例。 :))

    【讨论】:

      【解决方案3】:

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

      Extract lambda body to method

      已添加新的内容辅助以将 lambda 的主体提取到方法中。
      要调用新功能,请在选定的 lambda 正文中执行 Ctrl + 1

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-05-10
        • 2016-10-01
        • 1970-01-01
        • 2011-08-17
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多