Java如何实现自定义映射(Function <?super T,?extended R> mapper),该映射可以转换给定功能的Map的值

时间:2019-09-21 23:02:46

标签: java collections java-stream

我有一个自定义排序的地图。我想使用map函数转换map中的每个值。我知道我可以使用java 8 stream()。map(function)实现此目的。但我想了解上述map(function)的工作原理,并编写一个自定义函数。

我已经阅读了几篇文章,但没有找到解释清算的文章。

我如何做:

SortedMap<String, Integer> items = new TreeMap();//TreeMap is a custom implementation
        items.put("item1", 2);
        items.put("item2", 1);

      SortedMap<String, Integer> transformedItems=items.entrySet().stream().collect(
             Collectors.toMap(
                   ( Map.Entry<String, Integer> entry)->entry.getKey(),//pick each key as it is
                     ( Map.Entry<String, Integer> entry)->entry.getValue()*2, //transform the value here.
                     (val1, val2) -> { throw new RuntimeException("Not expecting duplicate keys"); },
                     ()->new TreeMap<>()

我要怎么做:

SortedMap<String, Integer> items = new TreeMap();
        items.put("item1", 2);
        items.put("item2", 1);

      SortedMap<String, Integer> transformedItems=items.customMap(value->value*2)

这里的挑战是编写customMap(function)

1 个答案:

答案 0 :(得分:0)

您可以创建具有值映射功能的独立static方法。该方法几乎可以完成您的代码:

public static <K, V, R> TreeMap<K, R> mapValues(Map<K, V> map, Function<V, R> valueMapper) {
    return map.entrySet().stream().collect(
            Collectors.toMap(Map.Entry::getKey,
                             e -> valueMapper.apply(e.getValue()),
                             (a, b) -> { throw new AssertionError("Not expecting duplicate keys"); },
                             TreeMap::new));
}

测试

SortedMap<String, Integer> items = new TreeMap<>();
items.put("item1", 2);
items.put("item2", 1);

SortedMap<String, Integer> transformedItems = mapValues(items, value -> value * 2);

System.out.println(transformedItems);

输出

{item1=4, item2=2}

请注意,映射值如何具有不同的类型,例如

SortedMap<String, Double> transformedItems = mapValues(items, value -> value * 2.5);

System.out.println(transformedItems);

输出

{item1=5.0, item2=2.5}