? super T与? extends K的区别?
时间: 2023-06-28 21:05:43 浏览: 98
这是Java中泛型中的通配符,用于表示类型参数的上界和下界。
`? super T`表示未知类型是T的超类(包括T本身),即所有类型T的父类。这意味着我们可以将类型为T或其子类的对象赋值给这个通配符。
`? extends K`表示未知类型是K的子类(包括K本身),即所有类型K的子类。这意味着我们可以从这个通配符获得类型为K或其子类的对象。
例如,考虑以下代码:
```java
public void addObjects(List<? super Integer> list) {
list.add(1);
list.add(2);
}
public void printObjects(List<? extends Number> list) {
for(Number num : list) {
System.out.println(num);
}
}
```
在第一个方法中,我们使用`? super Integer`通配符来表示未知类型是Integer的超类。这意味着我们可以将类型为Integer或其父类的对象添加到列表中。在第二个方法中,我们使用`? extends Number`通配符来表示未知类型是Number的子类。这意味着我们可以从列表中获得类型为Number或其子类的对象并打印它们。
注意,`? super T`通配符用于写入数据,`? extends K`通配符用于读取数据。如果我们需要既要读又要写,那么我们需要使用未限定的通配符`?`。
相关问题
public static <T, K, U> Collector<T, ?, Map<K,U>> toMap(Function<? super T, ? extends K> keyMapper, Function<? super T, ? extends U> valueMapper, BinaryOperator<U> mergeFunction) { return toMap(keyMapper, valueMapper, mergeFunction, HashMap::new); } 这段代码除了去重还能做什么,写几个例子
除了去重之外,这段代码还可以将一个 List 转换成一个 Map。下面是一些使用 `toMap` 方法的例子:
1. 将 List 转换成 Map
```
List<Person> personList = Arrays.asList(new Person("Tom", 22), new Person("Jerry", 25), new Person("Lucy", 22));
Map<String, Integer> personMap = personList.stream().collect(Collectors.toMap(Person::getName, Person::getAge));
```
这段代码将一个存储着 Person 对象的 List 转换成一个以 Person 的 name 作为 key,age 作为 value 的 Map。
2. 将 List 转换成 Map,并对 value 进行合并
```
List<Person> personList = Arrays.asList(new Person("Tom", 22), new Person("Jerry", 25), new Person("Lucy", 22));
Map<String, Integer> personMap = personList.stream().collect(Collectors.toMap(Person::getName, Person::getAge, (v1, v2) -> v1 + v2));
```
这段代码将一个存储着 Person 对象的 List 转换成一个以 Person 的 name 作为 key,age 作为 value 的 Map,并且如果出现 key 冲突时将两个 value 值相加。
3. 将 List 转换成 TreeMap
```
List<Person> personList = Arrays.asList(new Person("Tom", 22), new Person("Jerry", 25), new Person("Lucy", 22));
Map<String, Integer> personMap = personList.stream().collect(Collectors.toMap(Person::getName, Person::getAge, (v1, v2) -> v1 + v2, TreeMap::new));
```
这段代码将一个存储着 Person 对象的 List 转换成一个以 Person 的 name 作为 key,age 作为 value 的 TreeMap。注意,此时需要提供一个 TreeMap 的构造方法作为第四个参数。
需要注意的是,使用 `toMap` 方法时需要确保 key 的唯一性,否则会抛出 IllegalStateException 异常。
collection tomap
Collectors.toMap是Java 8中提供的一个收集器,它可以将集合中的元素转换为一个Map。它有三个重载的方法,分别是:
1. toMap(Function<? super T,? extends K> keyMapper, Function<? super T,? extends U> valueMapper):根据元素的某个属性作为键,将元素本身作为值,生成一个Map。
2. toMap(Function<? super T,? extends K> keyMapper, Function<? super T,? extends U> valueMapper, BinaryOperator<U> mergeFunction):在遇到键冲突时,通过提供的函数来处理值的合并操作。
3. toMap(Function<? super T, extends K> keyMapper, Function<? super T,? extends U> valueMapper, BinaryOperator<U> mergeFunction, Supplier<M> mapSupplier):在遇到键冲突时,通过提供的函数来处理值的合并操作,并提供一个指定类型的Map作为结果。
关于