繁体   English   中英

Java8:在Collectors.toMap(..)中使用Function :: identity会产生参数不匹配错误

[英]Java8: Using Function::identity in Collectors.toMap(..) creates an argument mismatch error

鉴于这个简单的人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> ,其中key是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())
);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM