Java 使用标识键将流映射到地图的快捷方式
考虑以下示例代码,该代码通过将每个字符串映射到其长度并打印每个映射条目来处理字符串列表Java 使用标识键将流映射到地图的快捷方式,java,java-stream,Java,Java Stream,考虑以下示例代码,该代码通过将每个字符串映射到其长度并打印每个映射条目来处理字符串列表 package com.dbenergie.ndm.bnb.business; import java.util.Arrays; import java.util.List; import java.util.Map; import java.util.function.Function; import java.util.stream.Collectors; public class Applicati
package com.dbenergie.ndm.bnb.business;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.function.Function;
import java.util.stream.Collectors;
public class Application {
public static void main(String[] args) {
final List<String> strings = Arrays.asList("Hello", "World", "!");
// 1
final Map<String, Integer> stringCharacterCountMapping = strings.stream()
.collect(Collectors.toMap(Function.identity(), String::length));
stringCharacterCountMapping.entrySet().stream().forEach(System.out::println);
}
}
或类似的。有什么想法吗?我怀疑这是因为在映射中传递的单个参数可能非常模糊。价值还是关键
您可以自己轻松编写这样的收集器:
class MyCollectors {
public static <K, U> Collector<K, ?, Map<K,U>> toMapWithValueWrapper(Function<? super K, ? extends U> valueMapper) {
return Collectors.toMap(Function.identity(), valueMapper);
}
}
如果您想允许收集到一个映射,该映射的键类型是您正在收集的类型的超类。
toMap
而不定义键映射,这就是您的意思吗?toMap
隐式使用stream元素作为键。如果在文档()中看到,实际上有3个Collectors.toMap方法,每个方法都以keyMapper作为参数。因此,没有它是不可能的。看起来就像我实现的快捷方式一样-很遗憾看到这个用例还没有出现,但很高兴看到这是可以用相当少的代码实现的。我们可以消除t
,但问题是我们是否应该这样做。如果我们使用
,我们允许将更具体的元素流收集到具有更广泛键类型的映射中。这与我们使用函数的原因相同
class MyCollectors {
public static <K, U> Collector<K, ?, Map<K,U>> toMapWithValueWrapper(Function<? super K, ? extends U> valueMapper) {
return Collectors.toMap(Function.identity(), valueMapper);
}
}
class MyCollectors {
public static <T extends K, K, U> Collector<T, ?, Map<K,U>> toMap(Function<? super T, ? extends U> valueMapper) {
return Collectors.toMap(Function.identity(), valueMapper);
}
}