计时器类映射

时间:2018-08-28 11:33:26

标签: java list dictionary collections java-stream

例如,我有一个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()类怎么了?

2 个答案:

答案 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表达式。