lambda表达式中变量名的约定是什么?

wou*_*non 15 java lambda java-8

例如,我看到很多例子

int sum = widgets.stream()
                  .filter(w -> w.getColor() == RED)
                  .mapToInt(w -> w.getWeight())
                  .sum();
Run Code Online (Sandbox Code Playgroud)

我们可以在这些lambda表达式中使用任何variableName吗?

我认为变量名称具有约定,并且可以使用专有名称来提高可读性.

例如,如果我在pre-java8中使用w作为Widget,则代码将被避免为不可读.随着java 8的出现发生了什么变化?

   for(Widget w : widgets)
   {
         if(w.getColor() == RED) {
            sum += w.getWeight();
         }
    }
Run Code Online (Sandbox Code Playgroud)

为什么不能像这样编写代码:

int sum = widgets.stream()
                  .filter(widget -> widget.getColor() == RED)
                  .mapToInt(widget -> widget.getWeight())
                  .sum();
Run Code Online (Sandbox Code Playgroud)

也许上面的代码是直接做的,而且只在小部件列表中的小部件上.那么,还有更多:

哪个更易读:

    return  requestHolder.getRequests()
                        .stream()
                        .map(request -> request.getErrorHolder())
                        .flatMap(errorData -> errorData.getErrors().stream())
                        .collect(toList());
Run Code Online (Sandbox Code Playgroud)

要么

    return  requestHolder.getRequests()
                        .stream()
                        .map(t -> t.getErrorHolder())
                        .flatMap(r -> r.getErrors().stream())
                        .collect(toList());
Run Code Online (Sandbox Code Playgroud)

也许我错过了什么.你能解释一下吗?

Jea*_*art 15

默认惯例是:为变量命名,以便代码令人愉快且易于阅读.

在我看来,当变量的范围有限时,最好使用非常短的名称或虚拟名称.它使代码更易读,更轻,并且还表明变量的功能是有限的.

当变量在代码中广泛使用并且您希望避免将其与其他变量混淆时,首选名称是首选.

for(int i = 0 ; i < max ; ++i) {
    int myExplicitVar = myArray[i];
    // rest of the code using myExplicitVar several times
}
Run Code Online (Sandbox Code Playgroud)

对于lambdas,变量的范围通常非常有限,并且当名称很短时我发现它更容易阅读,因此只保留代码的重要部分,这首先是lambda表达式的重点.

在你的例子中,我发现短名称更直接.

简短的变量名称使代码不那么臃肿,但可能导致富裕上下文中的混淆.