java - Java-如何实现自定义映射(函数映射器),它可以在给定函数的情况下转换映射的值
问题描述
我有一个自定义的排序地图。我想使用 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)
解决方案
您可以创建一个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}
推荐阅读
- laravel - 使用 Laravel 并包含一个包,为什么我会调用未定义的方法
- php - 如何像 WordPress 一样在 Laravel 中获取类别列表
- python-3.x - 仅针对某些部分的字数
- spring - 在 Spring Framework 5.0:Functional Web Framework 如何将 newley 创建的实体的 id 放在 webflux serverresponse 标头中
- spring-boot - Spring Boot Batch 程序自动装配不能跨多个配置文件工作
- python - 为什么 IndexError:索引 1 超出轴 0 的范围,大小为 1
- debugging - 有没有办法直接在gdb或者lldb中运行Cargo搭建的程序?
- php - 如何在重定向到同一页面时在php中聚焦页面的特定部分
- python - 使用正则表达式捕获撇号
- elixir - Compose Ecto Queries in Elixir