首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java-8中的groupingBy操作

Java-8中的groupingBy操作
EN

Stack Overflow用户
提问于 2014-10-15 09:36:09
回答 1查看 855关注 0票数 1

我试图在Java 8上重写著名的星火文本分类(http://chimpler.wordpress.com/2014/06/11/classifiying-documents-using-naive-bayes-on-apache-spark-mllib/)示例。

我有一个问题--在这段代码中,我正在为获取所有文件中所有单词的idfs做一些数据准备:

代码语言:javascript
复制
    termDocsRdd.collect().stream().flatMap(doc -> doc.getTerms().stream()
                                .map(term -> new ImmutableMap.Builder<String, String>()
                                .put(doc.getName(),term)
                                .build())).distinct()        

我被困在groupBy手术中了。(我需要将其按术语分组,因此每个术语必须是一个键,值必须是一个文档序列)。在Scala中,这个操作看起来非常简单- .groupBy(_._2).但是我如何在Java中做到这一点呢?

我试着写了这样的东西:

代码语言:javascript
复制
    .groupingBy(term -> term, mapping((Document) d -> d.getDocNameContainsTerm(term), toList()));

但这是错误的..。

有人知道怎么用Java写吗?

非常感谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-10-15 11:21:54

如果我对你的理解是正确的,你想做这样的事情:

(import static java.util.stream.Collectors.*;)

代码语言:javascript
复制
Map<Term, Set<Document>> collect = termDocsRdd.collect().stream().flatMap(
 doc -> doc.getTerms().stream().map(term -> new AbstractMap.SimpleEntry<>(doc, term)))
.collect(groupingBy(Map.Entry::getValue, mapping(Map.Entry::getKey, toSet())));

Map.Entry/ AbstractMap.SimpleEntry的使用是由于Java-8中没有标准的Pair<K,V>类。Map.Entry实现可以完成此角色,但代价是具有不直观和冗长的类型和方法名称(关于充当Pair实现的任务)。

如果您正在使用当前的Eclipse (我用LunaSR1 20140925进行了测试)及其有限的类型推断,那么您必须稍微帮助编译器:

代码语言:javascript
复制
Map<Term, Set<Document>> collect = termDocsRdd.collect().stream().flatMap(
 doc -> doc.getTerms().stream().<Map.Entry<Document,Term>>map(term -> new AbstractMap.SimpleEntry<>(doc, term)))
.collect(groupingBy(Map.Entry::getValue, mapping(Map.Entry::getKey, toSet())));
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26379148

复制
相关文章

相似问题

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