我可以用lambda表达式替换功能接口的toString方法在JDK8(Can I override

2019-09-03 03:38发布

我可以覆盖功能接口的toString方法? 或改写。 是否有改变,实现功能接口和覆盖toString方法与lambda表达式匿名内部类优雅的方式? 我可以覆盖的toString当我创建JDK8兰巴表达。

interface Iface {
    void do();
}

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

我可以覆盖的toString IFACE?

Answer 1:

不,lambda表达式是用来表达一个方法的接口,就好像他们只是功能。 这是函数式语言的元素是在Java中实现(一个面向对象的语言)。

要覆盖的toString,你必须实现一个类的接口。



Answer 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方法的返回值(如果有任何),并产生与另一个功能界面自定义字符串。



Answer 3:

每个Lambda表达式实现一个@FunctionalInterface。 所以,你必须总是选择通过接口与同类型,而不是一个拉姆达本身。 你甚至可以创建这个接口的一个新的实现(匿名内部类,内部类,或独立的类)。 但是,如果你关心的lambda表达式的语法或什么传递的方法引用你也可以试试下面的答案之一, 创建lambda表达式的字符串表示或命名(的toString)LAMBDA表达式进行调试目的



文章来源: Can I override toString method of functional interface in JDK8 using lambdas