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 aCollector
.Collector
has multiple abstract methods, so it isn't a functional interface, and can't have the@FunctionalInterface
annotation.Method references like
Class::function
orobject::method
can only be assigned to functional interface types. SinceCollector
is not a functional interface, no method reference can be used to supply the argument tocollect(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 aCollector
instance that can be passed tocollect()
.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.