将参数System.out :: println提供给方法

时间:2014-06-19 09:07:34

标签: java

我忘记了一个我用过的概念,并且无法记住它。

对于上下文,我曾经有一个像toString()这样的方法,它有一个参数。这个参数允许我调用我的方法myMethod(System.out::println)将其打印在屏幕上,还可以将其打印在具有相同语法的文件中。

有谁知道这个参数是什么?这个概念? 我认为它是一种 FunctionalInterface ,但我不知道它是什么。

3 个答案:

答案 0 :(得分:2)

这称为方法引用,如果您知道要调用的方法,则应用此方法,前提是该方法已存在。

From the tutorial :

  

因为此lambda表达式调用现有方法,所以您可以使用   方法引用而不是lambda表达式:

     

Arrays.sort(rosterAsArray,Person :: compareByAge);

自Java-8以来可用。

使用您想要的例子:

    public static void function(String s, Consumer<String> f) {
    f.accept(s);
}

public static void main(String args[]) {
    String test1 = "test";
    String test2 = "test2";
    function(test1, System.out::println);
    function(test2, System.out::println);
    function(test1, System.out::print);
    function(test2, System.out::print);
}

答案 1 :(得分:0)

这对你有用吗?

public class C {
  static void myMethod(java.io.PrintStream p) {
    p.println("Hello!");
  }
  public static void main(String args[]) {
    myMethod(System.out);
  }
}

不幸的是,你不能直接传递System.out.println,因为在Java方法中(在Java 8之前)不是第一类对象。你可以用方法做的就是调用它。作为解决方法,您可以引入接口并创建适配器类。

答案 2 :(得分:0)

这与java 8功能界面相吻合:

@FunctionalInterface
static interface MyPrinter {
    public void println(String line);
}

static void myMethod(MyPrinter mp) {
    mp.println("Hello wolrd");
}

...

public static void main(String[] args) throws IOException {
    myMethod(System.out::println);

    PrintWriter pw = new PrintWriter("myFile.txt");
    myMethod(pw::println);
    pw.close(); //never forget to close file output streams!

    //EDIT: note that you can of course store your MyPrinter in a variable:
    MyPrinter mp = System.err::println;
    myMethod(mp);
}
相关问题