System.out.println 功能接口的类型是什么?
is the type of System.out.println functional interface?
有一件事我不明白,方法引用的类型不应该是函数式接口吗?那么我们如何将 System.out::println 作为参数传递给 forEach?在以下代码中:
1-System.out::println 是消费者吗?
2-如果是,它的泛型是什么?我指的不是调用方法的列表类型,而是传递给 forEach 的方法引用的泛型类型。
Consumer<Integer> consumer=System.out::println;
numbers.forEach(consumer);
System.out.println
的类型不是功能接口,因为 System.out.println
是方法,而不是接口。
但是,方法引用System.out::println
可以用作功能接口的实现。因为 println
接受一个参数而 returns 什么都不接受,你可以说它“消耗”了你传递给它的参数。因此它适合作为 Consumer<T>
功能接口的实现。
请注意 println
有多种变体,可用于实现不同的功能接口。
例如:
引用public void println(int x)
的方法可以实现IntConsumer
.
引用public void println(double x)
的方法可以实现DoubleConsumer
.
引用public void println(Object x)
的方法可以实现Consumer<T>
.
- System.out.println 是方法而不是接口
- System.out::println 可以被视为接口的一个实现,因为它接受一个参数并且 returns 什么都没有
这部分代码:
Consumer<Integer> consumer=System.out::println;
等于此 lambda 表达式:
Consumer<Integer> consumer=i->System.out.println(i);
及以上代码块可以使用消费者接口以这种方式编写为匿名内部 class:
Consumer<Integer> consumer=new Consumer<Integer>(){
public void accept(Integer i){
System.out.println(i);
}
}
所以“System.out.println”本身不是一个功能接口,但是当你使用::时,你隐式地实现了消费者接口。
有一件事我不明白,方法引用的类型不应该是函数式接口吗?那么我们如何将 System.out::println 作为参数传递给 forEach?在以下代码中:
1-System.out::println 是消费者吗?
2-如果是,它的泛型是什么?我指的不是调用方法的列表类型,而是传递给 forEach 的方法引用的泛型类型。
Consumer<Integer> consumer=System.out::println;
numbers.forEach(consumer);
System.out.println
的类型不是功能接口,因为 System.out.println
是方法,而不是接口。
但是,方法引用System.out::println
可以用作功能接口的实现。因为 println
接受一个参数而 returns 什么都不接受,你可以说它“消耗”了你传递给它的参数。因此它适合作为 Consumer<T>
功能接口的实现。
请注意 println
有多种变体,可用于实现不同的功能接口。
例如:
引用
public void println(int x)
的方法可以实现IntConsumer
.引用
public void println(double x)
的方法可以实现DoubleConsumer
.引用
public void println(Object x)
的方法可以实现Consumer<T>
.
- System.out.println 是方法而不是接口
- System.out::println 可以被视为接口的一个实现,因为它接受一个参数并且 returns 什么都没有
这部分代码:
Consumer<Integer> consumer=System.out::println;
等于此 lambda 表达式:
Consumer<Integer> consumer=i->System.out.println(i);
及以上代码块可以使用消费者接口以这种方式编写为匿名内部 class:
Consumer<Integer> consumer=new Consumer<Integer>(){
public void accept(Integer i){
System.out.println(i);
}
}
所以“System.out.println”本身不是一个功能接口,但是当你使用::时,你隐式地实现了消费者接口。