java - 我可以在 Java 中创建一个变量数组吗?
问题描述
基于另一个设置,我有一个需要设置为数组元素的变量列表。我怎样才能使这个简洁,没有指针?
示例:我有一个包含国际象棋移动和变量 startRow、startCol、endRow、endCol、color、piece(所有字符串)的字符串。
数据来自一个字符串,我将其拆分为 String[] 位。
但是如果关联类型是“A”,那么字符串是
startRow, startCol, endRow, endCol, color, piece
但如果类型是“E”,那么字符串是
piece, color, startRow, endRow, startCol, endCol
我有同名的变量。我可以
case "A":
startRow = bits[0];
startCol = bits[1];
(etc)
case "E":
startRow = bits[2];
startCol = bits[4];
(etc)
但我愿意
Vars[] av = {startRow, startCol, endRow, endCol, color, piece};
Vars[] ev = {piece, color, startRow, endRow, startCol, endCol};
并将 Vars[] allv 设置为 1 并循环:
allv[i] = bits[i];
C(或 PHP)不是一个选项!
解决方案
如果startRow
,startCol
等是字段(与局部变量相反),您可以为每个字段编写一个匿名函数,该函数具有将其参数的值分配给字段的行为。
例如
List<Consumer<String>> aSetters =
Arrays.asList(
s -> startRow = s,
s -> startCol = s,
s -> endRow = s,
s -> endCol = s,
s -> color = s,
s -> piece = s);
List<Consumer<String>> eSetters =
Arrays.asList(
s -> piece = s,
s -> color = s,
s -> startRow = s,
s -> startCol = s,
s -> endRow = s,
s -> endCol = s);
List<Consumer<String>> setters; // initialize to aSetters or eSetters accordingly
for (int i = 0; i < bits.length; i++) {
setters.get(i).accept(bits[i]);
}
使用匿名函数的另s -> color = s
一种方法是使用对该字段的设置器的方法引用,如果有可用的(例如this::setColor
)。
如果startRow
, etc. 是局部变量,则没有真正的好方法可以做到这一点,因为 Java 不允许您从匿名函数分配给局部变量。有一些讨厌的 hack,比如用长度为 1 的数组替换每个变量,并从匿名函数中分配给数组的第 0 个元素,这是允许的,但这可能会让人很困惑。
推荐阅读
- python - tf.gradients() 返回 [None] 的列表
- python - 使用 Python DSL 在 Elasticsearch 中按日期范围过滤数据
- sql - 红移正则表达式匹配
- javascript - BOOTSTRAP:如何让我当前的导航栏有一个下拉选项?
- perl - Class::Struct 错误:找不到对象方法
- fonts - 新语言的 Tesseract 培训,第一民族,加拿大土著无语言不被认可
- arduino - Arduino 通信中的数据不正确
- android - RenderThread 杂乱无章的 android logcat
- arrays - 在 TypeScript 中,如何确认数组包含字符串文字联合类型的所有可能值?
- java - 为 SQLite 表加载表配置