简体   繁体   中英

is the type of System.out.println functional interface?

I do not understand one thing, should not the type of the method reference be a functional interface? So how do we pass System.out::println as a parameter to forEach?in the following code:

1-is System.out::println a Consumer?

2-if yes what is its generic type? I do not mean the type of list that is calling the method, but the generic type of the method reference that passed to the forEach.

Consumer<Integer> consumer=System.out::println;
numbers.forEach(consumer); 

The type of System.out.println is not a functional interface, since System.out.println is a method, not an interface.

However, the method reference System.out::println can be used as an implementation of a functional interface. Since println accepts an argument and returns nothing, you can say that it "consumes" the argument you pass to it. Therefore it fits as an implementation of the Consumer<T> functional interface.

Note the there are multiple variants of println , which can be used to implement different functional interfaces.

For example:

  • A method reference to public void println(int x) can implement IntConsumer .

  • A method reference to public void println(double x) can implement DoubleConsumer .

  • A method reference to public void println(Object x) can implement Consumer<T> .

  1. System.out.println is method not an interface
  2. System.out::println can be treated as an impl of interface since it takes an argument and returns nothing

This part of code:

Consumer<Integer> consumer=System.out::println;

is equal to this lambda expression:

Consumer<Integer> consumer=i->System.out.println(i);

and above code block could be written in this way as an anonymous inner class using Consumer interface:

Consumer<Integer> consumer=new Consumer<Integer>(){
   public void accept(Integer i){
      System.out.println(i);
   }
}

So "System.out.println" itself it is not a functional interface, but when you use:: you implicitly implement the Consumer interface.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

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