Java 映射合并函数(不应该调用';吗!)
我不明白下面这个相当简短的方法为什么调用Java 映射合并函数(不应该调用';吗!),java,Java,我不明白下面这个相当简短的方法为什么调用merge()函数(以确定与同一个键关联的值会发生什么) 该方法应按应用程序对搜索配置列表进行分组,并对映射键(应用程序按名称)以及映射值(搜索配置按名称)进行排序。也许第二条流不是直截了当的,我可以/应该使用另一种方法,但我不想知道发生了什么 输出大致如下: 附件1 搜索配置标题1 搜索配置标题2 附件2 搜索配置标题 附件3 搜索配置标题1 搜索配置标题2 搜索配置标题3 ApplicationInfo实现没有覆盖int hashCod
merge()
函数(以确定与同一个键关联的值会发生什么)
该方法应按应用程序对搜索配置列表进行分组,并对映射键(应用程序按名称)以及映射值(搜索配置按名称)进行排序。也许第二条流不是直截了当的,我可以/应该使用另一种方法,但我不想知道发生了什么
输出大致如下:
- 附件1
- 搜索配置标题1
- 搜索配置标题2
- 附件2
- 搜索配置标题
- 附件3
- 搜索配置标题1
- 搜索配置标题2
- 搜索配置标题3
int hashCode()
或布尔等于(对象)
我原以为对于每个搜索配置列表,第二个流中的映射键总是不同的。然而,在一种特殊的情况下,调用了merge函数,我完全不明白为什么会调用它
public SortedMap<ApplicationInfo, List<SearchConfigInfo>> groupByApplications(final BusinessLogicProcessingContext ctx,
final List<SearchConfigInfo> searchConfigInfos) {
requireNonNull(ctx, "The processing context must not be null.");
requireNonNull(searchConfigInfos, "The search configuration informations must not be null.");
final String lang;
final RtInfoWithTitleComparator comp;
lang = ContextLanguage.get(ctx);
appComp = new RtInfoWithTitleComparator(lang);
final Map<ApplicationInfo, List<SearchConfigInfo>> appToSearchConfigs;
appToSearchConfigs = searchConfigInfos.stream()
.collect(groupingBy(searchConfig -> RtCache.getApplication(searchConfig.getApplicationGuid())));
return appToSearchConfigs.entrySet()
.stream()
.collect(toMap(Map.Entry::getKey,
p_entry -> _sortValueList(p_entry.getValue()),
merger(),
() -> new TreeMap<>(appComp)));
}
public SortedMap groupByApplications(最终BusinessLogicProcessingContext ctx,
最终列表搜索(配置信息){
requirennull(ctx,“处理上下文不能为null”);
requirennull(searchConfigInfos,“搜索配置信息不能为null”);
最后串郎;
最终RTINFO与Title Comparator comp;
lang=ContextLanguage.get(ctx);
appComp=新的RTINFO和标题比较程序(lang);
最终地图appToSearchConfigs;
appToSearchConfigs=searchConfigInfos.stream()
.collect(groupby(searchConfig->RtCache.getApplication(searchConfig.getApplicationGuid()));
返回appToSearchConfigs.entrySet()
.stream()
.collect(toMap)(Map.Entry::getKey,
p_entry->_sortValueList(p_entry.getValue()),
合并(),
()->新树形图(appComp));
}
地图的总合同为:
“将键映射到值的对象。映射不能包含重复的键;每个键最多可以映射到一个值。”
这就是为什么我真的想知道在这种情况下会发生什么
private static BinaryOperator<List<SearchConfigInfo>> merger() {
return (list1, list2) -> { System.out.println(RtCache.getApplication(list1.get(0).getApplicationGuid()).hashCode());
System.out.println(RtCache.getApplication(list2.get(0).getApplicationGuid()).hashCode());
System.out.println(list1.get(0).getApplicationGuid().equals(list2.get(0).getApplicationGuid()));
list1.addAll(list2);
return list1;
};
}
私有静态二进制运算符合并(){
return(list1,list2)->{System.out.println(RtCache.getApplication(list1.get(0.getApplicationGuid()).hashCode());
System.out.println(RtCache.getApplication(list2.get(0.getApplicationGuid()).hashCode());
System.out.println(list1.get(0.getApplicationUID().equals)(list2.get(0.getApplicationUID());
列表1.addAll(列表2);
返回列表1;
};
}
正如我在简单的STDOUT调试语句中看到的,hashcode是不同的,而且它们彼此不相等。注意,您提供了一个
TreeMap
,作为提供给collector.toMap()
方法的supplier函数的结果(这是最后一个参数):
toMap(Map.Entry::getKey,
p_entry->_sortValueList(p_entry.getValue()),
合并(),
()->新树形图(appComp));
(supplier函数提供收集器将用于包含结果的集合-因此在本例中,它始终提供一个树映射
)
,这就是为什么在这种情况下可以得到一个键冲突-冲突是针对供应商地图而不是它们来源的地图进行的
toMap(Map.Entry::getKey,
p_entry -> _sortValueList(p_entry.getValue()),
merger(),
() -> new TreeMap<>(appComp)));