The follow code:
public class Test {
public static void main(String[] args) {
Stream.of(1, 2, 3).map(String::valueOf).collect(Collectors::toList);
}
}
IntelliJ tell me:
Collector<String, A, R> is not a functional interface
but when I modify the code as follows, everything is ok, I don't know why?
public class Test {
public static void main(String[] args) {
Stream.of(1, 2, 3).map(String::valueOf).collect(Collectors.<String>toList());
}
}
The reason that the first syntax is illegal is that the target type implied by the method signature—Stream.collect(Collector)—is a Collector. Collector has multiple abstract methods, so it isn't a functional interface, and can't have the @FunctionalInterface annotation.
Method references like Class::function or object::method can only be assigned to functional interface types. Since Collector is not a functional interface, no method reference can be used to supply the argument to collect(Collector).
Instead, invoke Collectors.toList() as a function. The explicit <String> type parameter is unnecessary, and your "working" example won't work without parentheses at the end. This will create a Collector instance that can be passed to collect().
The Collector interface has multiple methods (combiner(), finisher(), supplier(), accumulator()) the require an implementation, so it can't be a functional interface, which can have only one method with no default implementation.
I don't see how your question is related to the attached code.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With