java stream - 带方法引用的flatmap

Joe*_*oey 3 java java-8 java-stream

我是java的新手,所以我的问题是为什么这个工作:

这个方法在我Tree班上:

public Stream<Tree> flattened() {
    return Stream.concat(
            Stream.of(this),
            children.stream().flatMap(Tree::flattened));
}
Run Code Online (Sandbox Code Playgroud)

flatMap想要一个带有t作为param的函数,而flattened方法根本没有输入参数

这里发生了什么事?

Joe*_*e C 7

函数调用中确实存在隐藏参数.因为flattened是非静态方法,所以函数中有一个隐含参数,称为this.

基本上,您正在调用flattened流中的每个对象,并且所述元素是您的参数.

编辑(澄清):Tree::flattened可以表示两件事之一.这可能意味着:

tree -> Tree.flattened(tree) //flattened is a static method, which yours is not
Run Code Online (Sandbox Code Playgroud)

或者它也可能意味着:

tree -> tree.flattened() //flattened is an instance method, as in your case
Run Code Online (Sandbox Code Playgroud)

除此之外,它还可能意味着:

tree -> this.flattened(tree) //also doesn't apply to your case
Run Code Online (Sandbox Code Playgroud)

来自JLS:

如果编译时声明是实例方法,则目标引用是调用方法的第一个形式参数.否则,没有目标参考

  • @JoeC你的答案是正确的,但你说出来的方式和你的最后评论让我想知道这是否是解释它的最佳方式. (2认同)
  • 我会这样说:当 `flattened()` 是一个实例方法时,`Tree::flattened` 等价于 `tree -&gt; tree.flattened()`。 (2认同)