你好,亲爱的同事们。
作为Java的一个练习,我编写了一个简单的程序,它可以从新闻门户抓取指向引用的链接。基本上,我想找出哪些门户是引用最多的。
现在,我得到了以下代码:
final Map> hostToURLs = Analyzer.mapByHost(ReferencesStore.read());
// E.g. bbc.com -> [ https://www.bbc.com/article1, https://www.bbc.com/article2, etc ]
// The following creates LinkedHashMap sorted by the number of URLs
final LinkedHashMap> sortedHostToURLs = hostToURLs
.entrySet()
.stream()
.sorted(Map.Entry.comparingByValue(Comparator.comparingInt(List::size)))
.collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue, (m, n) -> { m.addAll(n); return m; }, LinkedHashMap::new));我感兴趣的是,如果集合方法中丑陋的merge lambda (m,n)-> {m.addAll(n); return m;}可以替换为标准库中的一些方法引用。我在文档中找不到任何有用的东西,也无法问谷歌是否存在这样的合并函数。提前谢谢你。
发布于 2020-07-19 15:09:50
问题是,在您的情况下,永远不会调用合并函数,因为您所做的只是重新排序一个现有的映射,因此,我不需要担心它。
就我个人而言,在这种情况下,我只使用(m, n) -> m,因为它很短,不会分散注意力。
另一个变体是使用一个在调用时抛出异常的函数。当您使用不接受合并函数的这本身就是重载时,JDK:
private static BinaryOperator throwingMerger() {
return (u,v) -> { throw new IllegalStateException(String.format("Duplicate key %s", u)); };
}另一件事,你可能想要考虑它不使用(Linked)HashMap在这里,而是简单地收集Entrys到一个列表。如果稍后需要按键查找条目,则只需保留原始地图即可。
编辑:在使用合并函数的情况下,您的实现是可以的。您可能只想把它放在一个变量中,以便它的名称可以描述它的函数。
您可以考虑的一件事是使用创建新列表的函数,而不是“重用”现有列表之一。这将更好地反映代码的功能样式,通常使用不可变的数据结构。
基本的问题是,Java的List接口并不适合于功能/不变的情况,也没有一种简单的方法来连接两个列表。
如果您对其他库开放,您将有更多的选项。例如,Apache的公域有一个union方法。
https://codereview.stackexchange.com/questions/245702
复制相似问题