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

时间:2018-06-20 13:55:00

标签: java lambda syntax java-8 functional-interface

在Java 8的功能中,有一个快捷方式,即

() -> 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())

2 个答案:

答案 0 :(得分:2)

不是真的,唯一可能的是:对方法引用使用类名:

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

显然,这是“更多”的输入。另一方面,它告诉您有关所涉及类型的详细信息。

答案 1 :(得分:1)

方法引用的语法在JLS-15处定义,并写为Object::method,无需讨论-您不能写::method,因为方法的来源仍然未知。变量var是对象的实例,对吗?因此:

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

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

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