是否可以缩写 java 函数来删除变量?

Is it possible to abbreviate java functions removing the variable?

在Java8的函数中,有一个快捷方式,即

() -> new ArrayList()

然后是:

ArrayList::new

在使用流时,我发现自己声明了很多这样的函数:

s.map(var -> var.getFoo()).flatMap(var -> var.parallelStream()).map(var -> var.getBar())

前缀是var -> var.是不是也有缩写?像

s.map(::getFoo()).flatMap(::parallelStream()).map(::getBar())

不太可能,唯一可能的是:使用 class 名称作为方法引用:

s.map(FooHolder::getFoo).flatMap(Whatever::parallelStream).map(OwnersOfBar::getBar)

显然,那是 "more" 打字。另一方面,它有点冗长,告诉你所涉及的类型。

方法引用的语法在 JLS-15 中定义,未经讨论就写成 Object::method - 你不能写成 ::method 因为方法的来源仍然未知。变量 var 是一个对象的实例,对吧?因此:

s.map(MyObject::getFoo).flatMap(Collection::parallelStream).map(MyObject::getBar)

我个人的建议是选择易读的方式而不是简短的方式。缩短并不意味着可读性。出于某种原因,我不喜欢 Object::method 方法参考,而是使用 var -> var.method()。这是一个讨论和个人喜好的问题。

但是,代码段上方的声明是确定的。您必须遵循语法。