我看到很多例子,例如
int sum = widgets.stream()
.filter(w -> w.getColor() == RED)
.mapToInt(w -> w.getWeight())
.sum();
我们可以在这些lambda表达式中使用任何variableName吗?
我认为变量名称具有约定,并且可以使用专有名称来提高可读性。
例如,如果我在pre-java8中使用w作为Widget,则代码将被避免为不可读。随着java 8的出现发生了什么变化?
for(Widget w : widgets)
{
if(w.getColor() == RED) {
sum += w.getWeight();
}
}
为什么不能像这样编写代码:
int sum = widgets.stream()
.filter(widget -> widget.getColor() == RED)
.mapToInt(widget -> widget.getWeight())
.sum();
也许上面的代码是直接做的,而且只在小部件列表中的小部件上。所以,还有更多:
哪个更易读:
return requestHolder.getRequests()
.stream()
.map(request -> request.getErrorHolder())
.flatMap(errorData -> errorData.getErrors().stream())
.collect(toList());
或
return requestHolder.getRequests()
.stream()
.map(t -> t.getErrorHolder())
.flatMap(r -> r.getErrors().stream())
.collect(toList());
也许我错过了什么。你能解释一下吗?
答案 0 :(得分:14)
默认惯例是:为变量命名,以便代码令人愉快且易于阅读。
在我看来,当变量的范围有限时,最好使用非常短的名称或虚拟名称。它使代码更易读,更轻,并且还表明变量的功能是有限的。
当变量在代码中广泛使用并且您希望避免将其与其他变量混淆时,首选显式名称。
for(int i = 0 ; i < max ; ++i) {
int myExplicitVar = myArray[i];
// rest of the code using myExplicitVar several times
}
对于lambdas,变量的范围通常非常有限,当名称短时,我发现它更容易阅读,所以只有代码的重要部分仍然是,这是lambda的要点表达式首先。
在你的例子中,我发现短名称更直接。
短变量名称使代码变得不那么臃肿,但可能会导致在富环境中出现混淆。
答案 1 :(得分:1)
我使用Java8已经有一段时间了,事实上我发现我经常使用更长的名字。我对此的看法是一个简单的经验法则:我喜欢简短的名字。
我通常会选择 i 或 y 这样的简短名称,如果很明显在流中发生了什么。如果您正在处理小部件流并执行4-6操作,那么每次编写小部件都很烦人,并且在几次操作之后行开始看起来相同。因此,对于相同的事物流,从上下文我很容易知道我正在做什么,我有时会选择短变量。它与循环迭代器相同,其中每个人都使用 i 而不是 index 。
另一方面,如果我做了很多处理,特别是如果我需要映射一些东西,我喜欢给出描述性的名字,甚至像 widget , filteredWidget < / em>, widgetHeight 等。
至于网络上的常用符号,请记住很多人都试图推广新的Java语法。很酷,它可以很短,所以他们倾向于尽可能地采取它。在Javaland,我们总是要写很多东西,而我的猜测是人们对我们可以输入更少的事实反应过度。在Venkat S.寻找关于2年前groovy或.js的例子时,他常常不知道他不必在行尾输入分号是多么重要。我想我们的大脑是如何运作的。