首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用于合并两个列表的Java -函数接口

用于合并两个列表的Java -函数接口
EN

Code Review用户
提问于 2020-07-19 13:28:20
回答 1查看 286关注 0票数 4

你好,亲爱的同事们。

作为Java的一个练习,我编写了一个简单的程序,它可以从新闻门户抓取指向引用的链接。基本上,我想找出哪些门户是引用最多的。

现在,我得到了以下代码:

代码语言:javascript
复制
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;}可以替换为标准库中的一些方法引用。我在文档中找不到任何有用的东西,也无法问谷歌是否存在这样的合并函数。提前谢谢你。

EN

回答 1

Code Review用户

发布于 2020-07-19 15:09:50

问题是,在您的情况下,永远不会调用合并函数,因为您所做的只是重新排序一个现有的映射,因此,我不需要担心它。

就我个人而言,在这种情况下,我只使用(m, n) -> m,因为它很短,不会分散注意力。

另一个变体是使用一个在调用时抛出异常的函数。当您使用不接受合并函数的这本身就是重载时,JDK:

代码语言:javascript
复制
private static  BinaryOperator throwingMerger() {
  return (u,v) -> { throw new IllegalStateException(String.format("Duplicate key %s", u)); };
}

另一件事,你可能想要考虑它不使用(Linked)HashMap在这里,而是简单地收集Entrys到一个列表。如果稍后需要按键查找条目,则只需保留原始地图即可。

编辑:在使用合并函数的情况下,您的实现是可以的。您可能只想把它放在一个变量中,以便它的名称可以描述它的函数。

您可以考虑的一件事是使用创建新列表的函数,而不是“重用”现有列表之一。这将更好地反映代码的功能样式,通常使用不可变的数据结构。

基本的问题是,Java的List接口并不适合于功能/不变的情况,也没有一种简单的方法来连接两个列表。

如果您对其他库开放,您将有更多的选项。例如,Apache的公域有一个union方法

票数 4
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/245702

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档