1. 概述
当我们阅读他人的代码时,有时会遇到一些新颖的、我们从未见过的方法。了解这些技巧不仅能帮助我们更好地理解代码库,还能激发我们对Java编程的新视角。
在这篇教程中,我们将讨论Java中的一个有趣用法:-->
。
2. 问题介绍
像往常一样,我们先看一个例子:
int i = 6;
while ( i-->0 ) {
// some processing in loop
}
乍一看,这段代码相当直接。一个while
循环执行了一些重复逻辑。
然而,如果我们仔细观察while
语句,i-->0
表达式是什么意思?我们可能以前没见过-->
运算符。在Java文档中搜索,我们能找到的最接近的运算符是用于lambda表达式的'->'。但显然,示例代码与lambda表达式无关。
接下来,我们先弄清楚-->
的作用,然后进行一个小测验,了解其他类似的技巧。
为了简洁,本教程将使用单元测试断言来展示变量值,而不是打印它们。
3. 解读 ‘
-->’
首先,'( i-->0 )'
中的-->
并不是Java的运算符。实际上,\( i-->0 \)
等同于\( (i--) > 0 \)
或者更清晰的形式:\( ((i--) > 0) \)
。
因此,它执行两个操作:后递减i
,然后检查i
是否大于0。
当我们将变量i
初始化为6时,循环内会依次产生数字:5、4、3、2、1和0。随着i
变为-1,循环结束:
List<Integer> resultWhile = new ArrayList<>();
int i = 6;
while (i-- > 0) {
resultWhile.add(i);
}
assertEquals(Lists.newArrayList(5, 4, 3, 2, 1, 0), resultWhile);
同样,我们也可以在for
循环中使用同样的技巧:
List<Integer> resultFor = new ArrayList<>();
for (int j = 6; j-- > 0; ) {
resultFor.add(j);
}
assertEquals(Lists.newArrayList(5, 4, 3, 2, 1, 0), resultFor);
现在我们明白了-->
的作用。接下来,在接下来的测验部分,让我们探索并实验一些类似的技巧。
4. 测验时间!
测验有四个挑战。
假设我们有一个整数列表:
List<Integer> result = new ArrayList<>();
每个挑战开始时,整数列表会被重置,然后在while
循环中逐步插入数字。我们的目标是确定循环执行后的列表内容。
第一个挑战是理解++<
。
4.1. 解读 ‘
++<‘
int i = -1;
while (i++<5) {
result.add(i);
}
与-->
类似,'*i++<5*'
先后递增i
,然后比较i
和5。由于i
的初始值为-1,结果将是0到5:
assertEquals(Lists.newArrayList(0, 1, 2, 3, 4, 5), result);
接下来,解读另一个表达式<--
。
4.2. 解读 ‘
<--‘
result.clear();
int j = 10;
while (0<--j) {
result.add(j);
}
这次,如代码所示,后递减操作被改为预递减。因此,循环将数字9填充到1到列表中:
assertEquals(Lists.newArrayList(9, 8, 7, 6, 5, 4, 3, 2, 1), result);
然后,让我们看看类似的表达式>++
。
4.3. 解读 ‘
>++‘
result.clear();
int n = 0;
while (6>++n) {
result.add(n);
}
如代码片段所示,'*6>++n*'
在每次循环步骤中先预递增i
,然后与6进行比较。因此,结果将是1到5:
assertEquals(Lists.newArrayList(1, 2, 3, 4, 5), result);
最后,来看一个看起来稍有不同的挑战。
4.4. 解读 ‘
>>>=‘
result.clear();
int x = 32;
while ((x>>>=1)>1) {
result.add(x);
}
这个挑战与其他的不同。x>>>=1
与预递增或后递减无关。>\>
是无符号右移运算符。
因此,\( x>>>1 \)
右移一位,结果等于x
除以2。此外,\( x >>>=1 \)
执行移位操作,并将结果重新赋给变量x
。所以,当x=32
时,结果列表包含16、8、4和2:
assertEquals(Lists.newArrayList(16, 8, 4, 2), result);
至此,我们已经完成了挑战并理解了'-->'
和其他类似技巧的工作原理。
5. 总结
在这篇文章中,我们讨论了Java中的-->
用法。此外,我们还进行了一次小测验,探索了一些相似的技巧。
值得注意的是,使用这些格式时,建议在两个运算符之间插入空格或花括号,以提高代码可读性。例如,应该写成i-- > 0
或(i--) > 0
,而不是i-->0
。
一如既往,所有示例代码的完整源码可以在GitHub上找到。