繁体   English   中英

将参数System.out :: println赋予方法

[英]Giving the parameter System.out::println to a method

我忘记了一个我曾经忘记的概念。

对于上下文,我曾经有一个像toString()这样的方法,该方法具有一个参数。 此参数使我可以调用诸如myMethod(System.out::println)之类的方法在屏幕上进行打印,也可以使用相同的语法将其打印在文件中。

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

这称为方法引用,当您知道要调用的方法时(只要该方法已存在)就适用。

从教程:

由于此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);
}

这对您有用吗?

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之前)不是一流的对象。 您只能使用方法来调用它。 解决方法是,可以引入接口并创建适配器类。

这与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);
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM