Java8:在 Collectors.toMap(..) 中使用 Function::identity 会产生参数不匹配错误
Java8: Using Function::identity in Collectors.toMap(..) creates an argument mismatch error
给定这个简单的 Person POJO:
public class Person {
private String id;
private String name;
public Person(String id, String name) {
super();
this.id = id;
this.name = name;
}
public String getId() {
return id;
}
public String getName() {
return name;
}
}
我想收集一个 Map<String, Person>
其中关键是 id
的人。
我试过这样实现:
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.function.Function;
import java.util.stream.Collectors;
public class CollectorMain {
public static void main(String[] args) {
List<Person> list = new ArrayList<>();
list.add(new Person("312", "John"));
list.add(new Person("454", "Alice"));
list.add(new Person("712", "Bob"));
Map<String, Person> map = list.stream()
.collect(
Collectors.toMap(Person::getId, Function::identity) // COMPILE ERROR
);
System.out.println(map.size());
}
}
但是我得到一个编译错误:
CollectorMain.java:[14,41] no suitable method found for toMap(Person::getId,Function::identity)
method java.util.stream.Collectors.<T,K,U>toMap(java.util.function.Function<? super T,? extends K>,java.util.function.Function<? super T,? extends U>) is not applicable
(cannot infer type-variable(s) T,K,U
(argument mismatch; incompatible parameter types in method reference))
method java.util.stream.Collectors.<T,K,U>toMap(java.util.function.Function<? super T,? extends K>,java.util.function.Function<? super T,? extends U>,java.util.function.BinaryOperator<U>) is not applicable
(cannot infer type-variable(s) T,K,U
(actual and formal argument lists differ in length))
method java.util.stream.Collectors.<T,K,U,M>toMap(java.util.function.Function<? super T,? extends K>,java.util.function.Function<? super T,? extends U>,java.util.function.BinaryOperator<U>,java.util.function.Supplier<M>) is not applicable
(cannot infer type-variable(s) T,K,U,M
(actual and formal argument lists differ in length))
作为解决方案,我可以用这个 lambda p -> p
替换 Function::identity
,如下所示:
Map<String, Person> map = list.stream()
.collect(
Collectors.toMap(Person::getId, p -> p)
);
是否可以使用 Function::identity
?
您不应使用方法引用。你应该使用 Function.identity()
.
如果您使用方法引用,您基本上是在尝试传递一个 Supplier<Function<T, T>>
。
Map<String, Person> map = list.stream().collect(
Collectors.toMap(Person::getId, Function.identity())
);
给定这个简单的 Person POJO:
public class Person {
private String id;
private String name;
public Person(String id, String name) {
super();
this.id = id;
this.name = name;
}
public String getId() {
return id;
}
public String getName() {
return name;
}
}
我想收集一个 Map<String, Person>
其中关键是 id
的人。
我试过这样实现:
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.function.Function;
import java.util.stream.Collectors;
public class CollectorMain {
public static void main(String[] args) {
List<Person> list = new ArrayList<>();
list.add(new Person("312", "John"));
list.add(new Person("454", "Alice"));
list.add(new Person("712", "Bob"));
Map<String, Person> map = list.stream()
.collect(
Collectors.toMap(Person::getId, Function::identity) // COMPILE ERROR
);
System.out.println(map.size());
}
}
但是我得到一个编译错误:
CollectorMain.java:[14,41] no suitable method found for toMap(Person::getId,Function::identity)
method java.util.stream.Collectors.<T,K,U>toMap(java.util.function.Function<? super T,? extends K>,java.util.function.Function<? super T,? extends U>) is not applicable
(cannot infer type-variable(s) T,K,U
(argument mismatch; incompatible parameter types in method reference))
method java.util.stream.Collectors.<T,K,U>toMap(java.util.function.Function<? super T,? extends K>,java.util.function.Function<? super T,? extends U>,java.util.function.BinaryOperator<U>) is not applicable
(cannot infer type-variable(s) T,K,U
(actual and formal argument lists differ in length))
method java.util.stream.Collectors.<T,K,U,M>toMap(java.util.function.Function<? super T,? extends K>,java.util.function.Function<? super T,? extends U>,java.util.function.BinaryOperator<U>,java.util.function.Supplier<M>) is not applicable
(cannot infer type-variable(s) T,K,U,M
(actual and formal argument lists differ in length))
作为解决方案,我可以用这个 lambda p -> p
替换 Function::identity
,如下所示:
Map<String, Person> map = list.stream()
.collect(
Collectors.toMap(Person::getId, p -> p)
);
是否可以使用 Function::identity
?
您不应使用方法引用。你应该使用 Function.identity()
.
如果您使用方法引用,您基本上是在尝试传递一个 Supplier<Function<T, T>>
。
Map<String, Person> map = list.stream().collect(
Collectors.toMap(Person::getId, Function.identity())
);