[英]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.