Java:没有“FormalParameter”的增强循环

问题描述 投票:0回答:1

是否可以在没有“FormalParameter”的情况下创建增强循环

for (@SuppressWarnings("unused") Object FormalParameter:List.of("1","2","3"))
  System.out.print("p"); //prints "ppp"

如果我不使用该参数,为了清楚起见,我想省略它(我有一些复杂的嵌套循环),以免出现“未使用的变量”警告,并知道它是否可能。抑制警告看起来并不明确。

有没有办法让这个更清楚?

java foreach
1个回答
0
投票

不,它是构造的必需部分,不能简单地省略。

但是,您有几个选择。

未来世界:
_

Java 正朝着将

_
视为官方的“这个不重要”名称的方向发展。对于相当多的 JDK 版本,
_
作为标识符(因为根据 Java 1.0 规范,
_
是一个名称,与“$”或“varName”相同)会收到警告,最近甚至会出现错误。 OpenJDK 团队正在对其进行转变,以让所有现有代码不再使用它,以便可以将其重用于其他用途。预期的“其他东西”是:无名不可访问的参数。

这个想法是最终你可以做这样的事情:

BiFunction<String, Integer, Integer> always0 = (_, _) -> 0;

现在这是不合法的(

_
不能使用;即使可以,两个参数也不能使用相同的名称。

大概一旦这个特性被完全引入到 java 中(现在还没有;java 仍在朝着这个方向迈进),最终这个原理就会扩展到各处。包括那里。所以,想必,你最终可以写:

for (Object _ : List.of(1,2,3)) {
  System.out.print("p");
}

而你、编译器、任何 linting 工具以及任何其他查看它的人都知道该代码块的作者完全有意从不使用实际参数。

但是,今天这对你来说没什么用处;今天,您会收到警告,甚至被视为非法。最多你可以将其命名为

unused
for (Object unused : List.of(1, 2, 3))
,感觉有点笨拙。

for (int i = 0; i < size; i++)

for 循环的

for (Object elem : list)
风格从根本上定义为“对集合中的每个元素执行某些操作”,而您编写的代码并没有真正做到这一点。这开始变成哲学,但是,我想说它更好地描述为“这个集合中有元素就重复做这件事”。例如,实际上不需要从集合中单独检索每个元素。想象一下,由于某种原因这样做是昂贵的(毕竟可能是 -
Collection
是一个接口,并且规范不要求通过迭代器快速推进!) - 但要求大小却不是。简单地说,如果集合只是对数据库访问的简单抽象,并且迭代需要实际获取和编组每一行,而“执行与此表中的行一样多的操作”只需要单个
SELECT COUNT(*)
查询。即使使用
Object _
,设计的语言也不会让收集接口知道它“实际上”不需要获取数据。您付出了相当大的成本,让 db 和 JDBC 驱动程序系统从数据库存储中获取所有数据,将其中继到 JVM,将其打包并将其编组到对象中,然后您将该对象扔进垃圾箱立即地。那就浪费了。 所以,考虑到这一点,我就这样写:

var list = List.of(1, 2, 3); for (int i = 0; i < list.size(); i++) { System.out.print("p"); }

主要的缺点是这个基本语法可能有点令人困惑。但这不是一个好的论点:“我是一名 java 程序员”意味着上面的代码立即在你的大脑中注册为“对,在 X 所在的位置执行此操作 X 次......list.size”。

这在任何语言,甚至人类语言中都是一个概念性的东西。在英语中,有这样一句话:“Be that as it may”。在荷兰语中,我们有一个类似的东西,甚至被写得乱七八糟:desalniettemin,字面意思是“des al niet te min”,其中“des”是一种古老的形式,几十年来都没有使用过,其余的意思是诸如“尽管如此,情况仍然如此”之类的东西。关键是,通过逐字逐句地分析它所表达的内容,“任何听众或读者都不会这样做”。他们看到“desalniettemin”并知道它的含义,

立即

。没有人的大脑会一次分析一个单词。英语也是如此:你读到“尽管如此”,你的大脑只是将其视为一个原子单位。 换句话说,将通常被解释为单个单元的东西,将其分解为多个部分,然后说:哇,太复杂了,我们必须简化! - 不是一个好主意。事实上,它几乎普遍被视为原子,这意味着这是一个不公平的结论。

因此,请记住,java 社区本质上了解某些模式,并且非常快速地阅读它们绝对没有问题。 for (int i = 0; i < size; i++) 就是这样一种模式。每个人都会立即知道这意味着什么,这正是您想要的:执行预先定义的次数。


© www.soinside.com 2019 - 2024. All rights reserved.