是否可以缩写 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()
。这是一个讨论和个人喜好的问题。
但是,代码段上方的声明是确定的。您必须遵循语法。
在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()
。这是一个讨论和个人喜好的问题。
但是,代码段上方的声明是确定的。您必须遵循语法。