【问题标题】:Java 8 functional interface with no arguments and no return valueJava 8 函数式接口,无参数,无返回值
【发布时间】:2014-05-26 11:08:51
【问题描述】:

Java 8 函数式接口对于什么都不接受也不返回什么的方法是什么?

即,相当于 C# 无参数 Actionvoid 返回类型?

【问题讨论】:

    标签: java java-8 java-stream


    【解决方案1】:

    如果我理解正确,您需要一个带有 void m() 方法的功能接口。在这种情况下,您可以简单地使用Runnable

    【讨论】:

    • Runnable 的接口规范表明它将为Thread 类提供可执行代码。在我不打算由线程执行的情况下使用Runnable 似乎不合适;似乎具有误导性。 Runnable 被定义为FunctionalInterface,因为它符合功能接口的规范,并且可以使用 lambda 语法创建。为什么不创建自己的功能界面?见Runnable,见FunctionalInterface
    • @TheSecretSquad (i) Runnable 被注释为@FunctionalInterface 并且 (ii) 即使在 lambda 表达式的上下文中,它也会在线程上执行:运行 lambda 的线程这可能是当前线程...
    • 我同意@TheSecretSquad,虽然它满足功能要求,但听起来不太语义化,Runnable 通常与创建线程相关联。一个带有 doWork 方法的简单 Worker 功能接口会很好。编辑:哎呀:stackoverflow.com/questions/27973294/…
    • 充实上面@jpangamarca 的“糟糕”:在他链接的重复问题的 cmets 中,Brian Goetz 确认 Runnable 旨在用于此目的,而不仅仅是用于线程上下文。
    • 既然如此,我认为 javadoc 应该更通用:docs.oracle.com/javase/8/docs/api/java/lang/Runnable.html
    【解决方案2】:

    自己做

    @FunctionalInterface
    public interface Procedure {
        void run();
    
        default Procedure andThen(Procedure after){
            return () -> {
                this.run();
                after.run();
            };
        }
    
        default Procedure compose(Procedure before){
            return () -> {
                before.run();
                this.run();
            };
        }
    }
    

    并像这样使用它

    public static void main(String[] args){
        Procedure procedure1 = () -> System.out.print("Hello");
        Procedure procedure2 = () -> System.out.print("World");
    
        procedure1.andThen(procedure2).run();
        System.out.println();
        procedure1.compose(procedure2).run();
    
    }
    

    和输出

    HelloWorld
    WorldHello
    

    【讨论】:

    • 我真的觉得,考虑到问题的精神,这应该是公认的答案。
    【解决方案3】:

    @FunctionalInterface 只允许方法抽象方法因此您可以使用 lambda 表达式实例化该接口,如下所示,您可以访问接口成员

            @FunctionalInterface
            interface Hai {
            
                void m2();
            
                static void m1() {
                    System.out.println("i m1 method:::");
                }
            
                default void log(String str) {
                    System.out.println("i am log method:::" + str);
                }
            
            }
        
        public class Hello {
            public static void main(String[] args) {
        
                Hai hai = () -> {};
                hai.log("lets do it.");
                Hai.m1();
        
            }
        }
    

    输出:

    i am log method:::lets do it.
    i m1 method:::
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-12-01
      • 1970-01-01
      • 2019-12-17
      • 1970-01-01
      • 1970-01-01
      • 2022-12-07
      • 2014-12-19
      相关资源
      最近更新 更多