我试图在Java 8上重写著名的星火文本分类(http://chimpler.wordpress.com/2014/06/11/classifiying-documents-using-naive-bayes-on-apache-spark-mllib/)示例。
我有一个问题--在这段代码中,我正在为获取所有文件中所有单词的idfs做一些数据准备:
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中做到这一点呢?
我试着写了这样的东西:
.groupingBy(term -> term, mapping((Document) d -> d.getDocNameContainsTerm(term), toList()));但这是错误的..。
有人知道怎么用Java写吗?
非常感谢。
发布于 2014-10-15 11:21:54
如果我对你的理解是正确的,你想做这样的事情:
(import static java.util.stream.Collectors.*;)
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进行了测试)及其有限的类型推断,那么您必须稍微帮助编译器:
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())));https://stackoverflow.com/questions/26379148
复制相似问题