Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/383.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用标识键将流映射到地图的快捷方式_Java_Java Stream - Fatal编程技术网

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