【问题标题】:Can I override toString method of functional interface in JDK8 using lambdas [duplicate]我可以使用 lambda 覆盖 JDK 8 中功能接口的 toString 方法吗?
【发布时间】:2013-05-14 13:30:48
【问题描述】:

我可以重写函数接口的 toString 方法吗? 或者改写。是否有优雅的方法来更改实现功能接口并使用 lambdas 覆盖 toString 方法的匿名内部类? 在JDK8中创建lamba表达式时可以覆盖toString吗?

interface Iface {
    void do();
}

main() { 
    Iface iface = () -> /*do something*/
    System.out.println(iface); // I would like to see anything useful in output
}

我可以为 iface 覆盖 toString 吗?

【问题讨论】:

  • @Keppil 我问了怎么做
  • @skydreamerr,StackOverflow 不是定制服务,您可以在其中告诉社区您想要什么,我们为您开发代码。通过展示您目前编写的代码来证明您至少已经做出了努力,我们将帮助您找出问题所在。
  • @Derek 我不要求你为我开发一些算法。我问了一般问题,有没有办法在功能接口中覆盖 toString 方法。
  • 或改写。有没有优雅的方法来更改实现功能接口并用 lambdas 覆盖 toString 方法的匿名内部类?
  • 如果它仅用于调试目的并且您在调试时不关心性能,请查看stackoverflow.com/a/42876841/1325574

标签: java lambda java-8


【解决方案1】:

每个 Lambda 表达式都实现一个 @FunctionalInterface。因此,您始终可以选择传递具有相同类型的接口而不是 lambda 本身。您甚至可以创建此接口的新实现(匿名内部类、内部类或独立类)。 但是,如果您关心 lambda 的语法或传递方法参考的内容,您也可以尝试以下对 Creating String representation of lambda expression 的答案之一 或Naming(toString) Lambda-Expressions for Debugging purpose

【讨论】:

    【解决方案2】:

    如果你拥有这个接口,你可以做这样的事情

    public interface Iface {
        void doIt();
    
        default Iface withToString(final String toString) {
            return new Iface(){
                public void doIt(){
                    Iface.this.doIt();
                }
    
                public String toString(){
                    return toString;
                }
            };
        }
    }
    
    public static void main(String... args){
        Iface iface = () -> {};
        iface = iface.withToString("anything useful");
        System.out.println(iface); // prints "anything useful" to output
    }
    

    当然,在实践中使用比字符串更有趣的东西会很有趣。从 doIt(如果有的话)捕获参数和返回值并使用另一个功能接口生成自定义字符串并不需要太多代码。

    【讨论】:

    • 这是一个很好的答案。谢谢。 BTW final 是多余的。
    • 我不确定我是否称其为多余,但在这里它肯定不重要。 FindBugs 让我迷上了将 final 放在任何地方,但这显然不是我一贯的做法。
    【解决方案3】:

    不,lambda 表达式用于表达一种方法接口,就好像它们只是函数一样。它是用 Java(一种 OOP 语言)实现的函数式语言的一个元素。

    要覆盖 toString,必须在类中实现接口。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-06-30
      • 1970-01-01
      • 2011-05-11
      • 1970-01-01
      • 1970-01-01
      • 2021-10-20
      • 1970-01-01
      • 2020-12-31
      相关资源
      最近更新 更多