接口泛型
Function<? super T, ? extends K>
形参: T 或 T 的父类(输入更宽)
返回值:返回 K 或 K 的子类(输出更窄)
PECS:这个函数将T作为消费者,用于写入数据,K作为返回值,用于生产数据,供调用者读取。这是符合逻辑的。
Function<? super Dog, ...> 接受 Function<Animal, ...> 是类型安全的。
java
Function<Animal, String> function = (Animal a) -> a.toString();
Function<Dog, String> function = (Dog a) -> a.toString();Map<K,U> toMap(Function<? super T, ? extends K> keyMapper, Function<? super T, ? extends U> valueMapper)
java
class Animal {
String name;
}
class Dog extends Animal {
int age;
public Dog(String name, int age) {
this.name = name;
this.age = age;
}
}java
List<Dog> dogs = List.of(
new Dog("旺财", 3),
new Dog("大黄", 5)
);java
Map<String, Integer> map = dogs.stream()
.collect(Collectors.toMap(
dog -> dog.name,
dog -> dog.age
));java
T = Dog
K,U=预期类型Map<String,String>
java
// 1. 用 Dog
Function<Dog, String> f1 = dog -> dog.name;
// 2. 用 Animal(父类)
Function<Animal, String> f2 = animal -> animal.name;
// 3. 用 Object(更父)
Function<Object, String> f3 = obj -> obj.toString();Map<String,Dog>
java
// 返回 Dog
Function<Dog, Dog> f1 = d -> d;
// 返回 Dog 子类
class Teddy extends Dog {}
Function<Dog, Teddy> f2 = d -> new Teddy();