Java-如何实现自定义映射(Function<? super T, ? extends R> 映射器),它可以在给定函数的情况下转换 Map 的值

标签 java collections java-stream

我有一个自定义排序的 map 。我想使用映射函数转换映射中的每个值。我知道我可以使用 java 8 stream().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)

最佳答案

您可以创建一个采用值映射函数的独立静态方法。该方法将完成您的代码所做的大部分工作:

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}

关于Java-如何实现自定义映射(Function<? super T, ? extends R> 映射器),它可以在给定函数的情况下转换 Map 的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58044765/

相关文章:

java - 过滤嵌套对象java 8

java - 将列表值流式传输到 Map.Entry.values

java - 为什么 System 类声明为 final 并带有私有(private)构造函数?

java - 如何从列表集合中获取特定元素?

java - 为什么 Java 集合框架提供两种不同的排序方式?

java - 使用 vavr 中的索引遍历列表

java - 我可以在映射时减少吗?

java - 项目选定监听器上的 Android 导航菜单未触发

java - 生成随机等级并正确标记它

java - 小版本更新后 Spring Security 异常 : "Please ensure Spring Security & Spring MVC are configured in a shared ApplicationContext"