Skip to content

接口泛型

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();