例如,我有一个Person
类
class Person {
private String firstName;
private String lastName;
private String street;
...
}
此外,我有一个List<Person> personList
,其中包含一些Person
对象。目标是将这些对象作为键放入Map<Person, Timer> personMap
,并添加new Timer()
对象作为值。因此每个Person
都有一个Timer()
。
我正在尝试下一步:
personMap = personList.stream().collect(toMap(person -> person, new Timer()));
但是编译器说:there is no instance(s) of type variable(s) T, U exist so that Timer conforms to Function<? super T, ? extends U>
。我一直在这里Java 8 List into Map搜索,但对我来说不起作用。
我想念什么? Timer()
类怎么了?
答案 0 :(得分:3)
您必须提供两者键的功能,并转到Collectors::toMap(Function<? super T,? extends K> keyMapper, Function<? super T,? extends U> valueMapper)
的位置,
keyMapper-生成键的映射函数
valueMapper-用于生成值的映射函数
您需要:
Map<Person, Timer> personMap = personList.stream()
.collect(Collectors.toMap(
person -> person, // Function to create a key
person -> new Timer())); // Function to create a value
为了更好地理解,以下是使用完全相同的Collector表示为匿名类的lambda:
new ArrayList<Person>().stream().collect(Collectors.toMap(
new Function<Person, Person>() { // Function to create a key
@Override
public Person apply(Person person) {
return person; // ... return self
}},
new Function<Person, Timer>() { // Function to create a value
@Override
public Timer apply(Person person) {
return new Timer(); // ... return a new Timer
}}
));
答案 1 :(得分:1)
toMap
的第二个参数是一个函数(在这种情况下为Function<? super Person, ? extends Timer> valueMapper
)。
new Timer()
不是Function
实例,而是Timer
实例(这说明了参数类型不匹配错误)。您可以使用以下方法解决问题:
Map<Person, Timer> map = personList.stream()
.collect(Collectors.toMap(Function.identity(), person -> new Timer()));
person -> new Timer()
是带有期望函数签名的lambda表达式。