我想对包含以下格式的数据的文本文件进行排序:A 8B 2C 5以它的价值。所以我发现了这个:Map<String, Long> getSortedLinkedHashMappedRankingArray(String[] rankingArray) { return Arrays .stream(rankingArray) .map(it -> it.split("\\s+")) .collect(Collectors.toMap(it -> it[FIRST_PART], it -> Long.valueOf(it[SECOND_PART]))) .entrySet() .stream() .sorted(Map.Entry.comparingByValue()) .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue, (oldValue, newValue) -> oldValue, LinkedHashMap::new));}除了上次收集操作,我几乎理解了所有内容:.collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue, (oldValue, newValue) -> oldValue, LinkedHashMap::new))你能解释一下这里发生了什么吗?什么是oldValue和newValue以及它是如何工作的?此外,我想听听我在collect操作前是否正确理解了部分内容。首先,我们正在创建给定数组的流。然后我们用空格分割数组的每个元素,这样我们就可以将name作为键和数字作为映射中的值。然后我们创建地图元素集并创建流。然后我们按价值排序。对?PS:我正在通过关键解释阅读Java排序图,但我不明白。
2 回答
潇潇雨雨
TA贡献1833条经验 获得超4个赞
所述(oldValue, newValue) -> oldValue, LinkedHashMap::new)
lambda表达式是合并函数,它在具有相同键的两个值应用。在这种情况下,它返回第一个值并丢弃第二个值。
也就是说,您的代码效率低下,因为您正在创建两个Map
并运行两个Stream
管道。你可以用一个来实现同样的目标:
Map<String, Long> getSortedLinkedHashMappedRankingArray(String[] rankingArray) { return Arrays .stream(rankingArray) .map(it -> it.split("\\s+")) .map(arr -> new SimpleEntry<> (arr[FIRST_PART], Long.valueOf(arr[SECOND_PART]))) .sorted(Map.Entry.comparingByValue()) .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue, (oldValue, newValue) -> oldValue, LinkedHashMap::new));}
凤凰求蛊
TA贡献1825条经验 获得超4个赞
第三个参数java doc
* a merge function, used to resolve collisions between
* values associated with the same key, as supplied
* to {@link Map#merge(Object, Object, BiFunction)}
.collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue,
(oldValue, newValue) -> oldValue, LinkedHashMap::new))
如果存在重复键,请选择上一个键或新键
添加回答
举报
0/150
提交
取消