问题 lambda表达式中变量名的约定是什么? [关闭]


例如,我看到很多例子

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

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


1884
2017-09-08 16:13


起源

对于它的价值,我认为使用没有任何问题 w 作为foreach循环中的变量名称。它非常清楚它是什么以及为什么它存在。这就像使用 i 作为一个柜台 for 循环。 - Michael Myers♦
像这样的方法 map 需要 每 元素并转换它。你称之为对象的引用并不重要。 - Sotirios Delimanolis
我同意这就像使用一样 i 作为循环计数器,但在lambda中可能存在一些情况,其中不清楚短名称所指的是什么,并且使用较长的名称会有所帮助。 - ajb
@ajb:当然,在这些情况下,建议使用更长的名称。但这并不意味着我们应该总是使用更长的名字。如果是 .mapToInt(widget -> widget.getWeight()) 大多数开发人员甚至会使用 .mapToInt(Widget::getWeight) 因为参数名称真无关紧...... - Holger
既然你问“我们可以在这些lambda表达式中使用任何variableName”,我相信一个正确的答案将包括“不,你不能使用与局部变量名称冲突的名称”。这意味着,例如,如果你在一个循环中 for (int i = ...),你也不能使用 i 作为lambda表达式中的参数名称。 - ajb


答案:


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

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

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

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

对于lambdas,变量的范围通常非常有限,我发现当名称很短时,它更容易阅读 所以只有代码的重要部分仍然存在,这首先是lambda表达式的重点。

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

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


13
2017-09-08 16:27





好吧,我使用Java8已经有一段时间了,事实上我发现我经常使用更长的名字。我对此的看法是一个简单的经验法则:我喜欢简短的名字。

我通常会选择简短的名字 一世 要么 ÿ 如果很清楚流内部发生了什么。如果您正在处理小部件流并执行4-6操作,那么写作 小部件 每次都很烦人,并且在几次操作之后线条开始看起来相同。因此,对于相同的事物流,从上下文我很容易知道我在做什么,我有时会选择短变量。它与每个人都使用的循环迭代器相同 一世 并不是 指数

另一方面,如果我做了很多处理,特别是如果我需要绘制一些东西,我喜欢给出描述性的名字,甚至是极端的 小部件filteredWidgetwidgetHeight 等等

至于网络上的常用符号,请记住很多人都试图推广新的Java语法。很酷,它可以很短,所以他们倾向于尽可能地采取它。在Javaland,我们总是要写很多东西,我的猜测是人们对我们可以输入更少的事实反应过度。在Venkat S.寻找关于2年前groovy或.js的例子时,他常常不知道他不必在行尾输入分号是多么重要。我想我们的大脑是如何工作的。


1
2017-09-08 18:56