【发布时间】:2017-09-13 11:35:33
【问题描述】:
我知道我们无法实例化一个接口,但是在学习一本关于 Streams 的书中的教程时,我感到很困惑。
我将只使用代码部分来突出显示我不理解的部分。
// count occurences of each word in a Stream<String> sorted by word
Map<String, Long> wordCounts =
Files.lines(Paths.get("Chapter2Paragraph.txt"))
.map(line -> line.replaceAll("(?!')\\p{P}", ""))
.flatMap(line -> pattern.splitAsStream(line))
.collect(Collectors.groupingBy(String::toLowerCase,
TreeMap::new, Collectors.counting()));
对于方法flatMap,当在API中点击时,它会说:
返回一个流,该流包含将此流的每个元素替换为通过将提供的映射函数应用于每个元素而生成的映射流的内容的结果。每个映射流在其内容被放入该流后关闭。 (如果映射流为空,则使用空流。)
那是什么意思呢?我有点理解它的作用,但我只是不明白它在幕后是如何工作的。当API提到在这种情况下返回时它是否返回一个对象,或者它是否意味着它替换了当前流?另外,当使用Streams时,编译器是否真的创建了这些元素的对象,然后在完成后终止?
另外,从上面的代码中,我只是想确保我是正确的。
当你有一个Map<String, Long> wordCounts 变量时,是否意味着在流终止时,最终结果必须完全遵循类型推断?
【问题讨论】:
-
您是在问文档是什么意思,或者它在幕后做了什么?因为这是两个几乎正交的问题。
-
阅读这个问题,我很高兴在迁移到 Java 8 之前了解了 Python 生成器。
-
@MadPhysicist 我想知道幕后发生了什么,为了更好地理解,在尝试任何其他语言之前先学习 Python 会更好吗?
-
您的问题是关于明确未指定的内容。该方法可能会返回一个新的
Stream实例或修改现有的实例(并返回它)。您只需要知道,您必须使用返回的实例。编译器不执行您要求的任何事情。编译器将你的源代码翻译成字节码。 -
@Scorpiorian83。不,如果您还没有基础概念的背景知识,Python 在这里帮不了您太多。
标签: java java-8 java-stream type-inference flatmap