作者:so-sweet天地 | 来源:互联网 | 2022-10-23 10:58
我想提供用户定义的方法来合并Java 8中的地图吗?您创建的方法应接受两个映射和“合并”行为。
public Map super T, ? super T> mergeMaps( Map super T, ? super
T> map1, Map super T, ? super T> map2 ) {
// merging code here
}
但我想要这样的东西
public Map super T, ? super T> mergeMaps( Map super T, ? super T>
map1, Map super T, ? super T> map2 , MergeTwoMaps mergeTwoMaps)
{
// merging code here
}
这样的事情。Java通用合并
Map map1 = new HashMap<>();
Map map2 = new HashMap<>();
map1.put(“key1”, 20);
map1.put(“key2”, 30);
map2.put(“key3”, 40);
map2.put(“key1”, 50);
mergeMaps(map1,map2,mergeBehaviour)
Output should be
map.get("key1")--> 70
Map map1 = new HashMap<>();
Map map2 = new HashMap<>();
map1.put(“key1”, "Hello");
map1.put(“key2”, "Hi");
map2.put(“key3”, "Ok");
map2.put(“key1”, "world");
mergeMaps(map1,map2,mergeBehaviour)
Output should be
map.get("key1")--> Helloworld
Holger..
5
您应该重新考虑所需的方法签名。引用指南:
应该避免使用通配符作为返回类型,因为这会迫使程序员使用代码来处理通配符。
换句话说,在返回类型中使用通配符会强制调用者使用返回的结果将通配符散布到每个代码中。
该方法应该看起来像:
public static Map mergeMaps(
Map extends K, ? extends V> map1, Map extends K, ? extends V> map2,
BinaryOperator mergeFunction) {
Map result = new HashMap<>(map1);
map2.forEach((k,v) -> result.merge(k, v, mergeFunction));
return result;
}
只要输入参数兼容,它就允许调用者选择任意键和值类型,如果输入映射的键和值类型与输出映射的子类型相同,则情况总是如此。当然,此签名还允许键和值类型相同但不要求使用的情况。
合并操作本身的实现很简单。
您可以通过使用来进一步提高方法的灵活性
public static Map mergeMaps(
Map extends K, ? extends V> map1, Map extends K, ? extends V> map2,
BiFunction super V, ? super V, ? extends V> mergeFunction) {
Map result = new HashMap<>(map1);
map2.forEach((k,v) -> result.merge(k, v, mergeFunction));
return result;
}
尽管这很少需要,因为在传递方法引用或lambda表达式时不必要。这仅在重用现有BiFunction
实例时才有用。
1> Holger..:
您应该重新考虑所需的方法签名。引用指南:
应该避免使用通配符作为返回类型,因为这会迫使程序员使用代码来处理通配符。
换句话说,在返回类型中使用通配符会强制调用者使用返回的结果将通配符散布到每个代码中。
该方法应该看起来像:
public static Map mergeMaps(
Map extends K, ? extends V> map1, Map extends K, ? extends V> map2,
BinaryOperator mergeFunction) {
Map result = new HashMap<>(map1);
map2.forEach((k,v) -> result.merge(k, v, mergeFunction));
return result;
}
只要输入参数兼容,它就允许调用者选择任意键和值类型,如果输入映射的键和值类型与输出映射的子类型相同,则情况总是如此。当然,此签名还允许键和值类型相同但不要求使用的情况。
合并操作本身的实现很简单。
您可以通过使用来进一步提高方法的灵活性
public static Map mergeMaps(
Map extends K, ? extends V> map1, Map extends K, ? extends V> map2,
BiFunction super V, ? super V, ? extends V> mergeFunction) {
Map result = new HashMap<>(map1);
map2.forEach((k,v) -> result.merge(k, v, mergeFunction));
return result;
}
尽管这很少需要,因为在传递方法引用或lambda表达式时不必要。这仅在重用现有BiFunction
实例时才有用。