Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/368.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 映射合并函数(不应该调用';吗!)_Java - Fatal编程技术网

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
ApplicationInfo实现没有覆盖
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)));