簡體   English   中英

如何在 Java 8 中將方法存儲在變量中?

[英]How can I store a method in a variable in Java 8?

是否可以將方法存儲到變量中? 就像是

 public void store() {
     SomeClass foo = <getName() method>;
     //...
     String value = foo.call();
 }

 private String getName() {
     return "hello";
 }

我認為這可以通過 lambdas 實現,但我不知道如何實現。

是的,您可以擁有對任何方法的變量引用。 對於簡單的方法,通常使用java.util.function.* classes 就足夠了。 這是一個工作示例:

import java.util.function.Consumer;

public class Main {

    public static void main(String[] args) {
        final Consumer<Integer> simpleReference = Main::someMethod;
        simpleReference.accept(1);

        final Consumer<Integer> another = i -> System.out.println(i);
        another.accept(2);
    }

    private static void someMethod(int value) {
        System.out.println(value);
    }
}

如果您的方法與這些接口中的任何一個都不匹配,您可以定義自己的方法。 唯一的要求是必須有一個抽象方法。

public class Main {

    public static void main(String[] args) {
    
        final MyInterface foo = Main::test;
        final String result = foo.someMethod(1, 2, 3);
        System.out.println(result);
    }

    private static String test(int foo, int bar, int baz) {
        return "hello";
    }

    @FunctionalInterface // Not required, but expresses intent that this is designed 
                         // as a lambda target
    public interface MyInterface {
        String someMethod(int foo, int bar, int baz);
    }
}

您可以使用 Java 8 方法引用。 您可以使用:: 'operator' 從對象中獲取方法引用。

import java.util.function.IntConsumer;

class Test {
    private int i;
    public Test() { this.i = 0; }
    public void inc(int x) { this.i += x; }
    public int get() { return this.i; }

    public static void main(String[] args) {
        Test t = new Test();
        IntConsumer c = t::inc;
        c.accept(3);
        System.out.println(t.get());
        // prints 3
    }
}

您只需要一個與您要存儲的方法的簽名相匹配的@FunctionalInterface java.util.function包含一些最常用的選擇。

您可以使用方法參考,如 -

System.out::println  

這相當於 lambda 表達式 -

x -> System.out.println(x).  

此外,您可以使用反射來存儲方法,它也適用於早期版本的java

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM