在一次执行中使用不同的参数制作多个 "for loops"
Make several "for loops" with different parameters in a single execution
在我的应用程序中,我有一个 for 循环,它从地图获取数据并将其添加到新地图,该地图将包含来自其他数据源(几个 enumClass)的更多数据。
我是这样做的:
private static Map<String, String> myMapConversion() {
for (myEnunClassKeyOne key : document.keySet()) {
String keyObteined = key.toString();
String value = document.get(key);
globalConfig.put(convertKey(keyToConversion), value); // Extension function get value of myEnunClassKeyOne key
}
return globalConfig;
}
我必须对其他 enumClasses 做同样的事情,并将数据添加到同一个 globalConfig 映射中,如下所示:
private static Map<String, String> mapConversion() {
for (myEnunClassKeyONE key : document.keySet()) {
String keyObteined = key.toString();
String value = document.get(key);
globalConfig.put(convertKey(keyToConversion), value); // Extension function get value of myEnunClassKeyOne key
}
for (myEnunClassKeyTWO key : document.keySet()) {
String keyObteined = key.toString();
String value = document.get(key);
globalConfig.put(convertKey(keyToConversion), value); // Extension function get value of myEnunClassKeyOne key
}
for (myEnunClassKeyTHREE key : document.keySet()) {
String keyObteined = key.toString();
String value = document.get(key);
globalConfig.put(convertKey(keyToConversion), value); // Extension function get value of myEnunClassKeyOne key
}
return globalConfig;
}
重复 for 循环对我来说似乎“不够优雅”。
你能想出一种更自动化的方法吗?
我已经尝试了几种方法,但一直无法正常工作。
它必须是 java 代码,尽管可以接受 Kotlin 扩展函数
提前致谢
--- 根据答案编辑---
@Tenfour04 你真好。
我的问题是 document1、document2 等的类型未经验证,我不知道如何正确键入。
我包括更多细节:
enum class Document1(val currentKey: String) {
color1("blue"),
color1("red"),
color1("green"),
color1("cyan"),
color1("yellow"),
color_show("yes"),
...
}
enum class Document2(val currentKey: String) {
word1("hello"),
word1("sky"),
word1("orange"),
word1("smile"),
word1("beauty"),
word_show("yes"),
...
}
因此,当我在“地图文档”中包含 Document1、Document2 等时,出现必需的类型错误
...
Map<?, ?>[] documents = { Document1, Document2, Document3** };
...
在 Java 中,您可以创建项目列表并对其进行迭代。我假设这些实际上是三个不同的文档。
private static Map<String, String> mapConversion() {
List<Map<?, String>> documents = List.of(document1, document2, document3);
for (Map<?, String> document : documents) {
for (Map.Entry<?, String> entry : document.entrySet()) {
String key = entry.getKey().toString();
String value = entry.getValue();
globalConfig.put(convertKey(keyToConversion), value);
}
}
return globalConfig;
}
在 Kotlin 中,您可以使用 mapKeysTo
:
更简洁地完成此操作
fun mapConversion(): MutableMap<String, String> {
listOf(document1, document2, document3).forEach {
it.mapKeysTo(globalConifg) { (key, _) -> convertKey(key.toString()) }
}
return globalConfig
}
抱歉,我错过了 Android 标签。 Pre-Java 9 你可以使用数组,但我认为你必须转换返回值:
private static Map<String, String> mapConversion() {
Map<?, ?>[] documents = { document1, document2, document3 };
for (Map<?, ?> document : documents) {
for (Map.Entry<?, String> entry : document.entrySet()) {
String key = entry.getKey().toString();
String value = (String)entry.getValue();
globalConfig.put(convertKey(keyToConversion), value);
}
}
return globalConfig;
}
由于它们是枚举定义而不是映射,您需要一种方法来一般地对它们进行相同的处理。一种方法是添加一种方法来从它们中的每一个获取地图。在每个枚举中都这样:
enum class Document1(val currentKey: String) {
color1("blue"),
color1("red");
companion object {
@JvmStatic val valuesMap: Map<String, Document1>() =
values().associateBy(Document1::currentKey)
}
}
然后你就可以使用地图了:
Map<?, ?>[] documents = { Document1.getValuesMap(), Document2.getValuesMap(), Document3.getValuesMap() };
在这种情况下,地图值是各种枚举类型,因此您可能必须使用 toString()
将它们转换为字符串才能将它们放入全局地图中。
在我的应用程序中,我有一个 for 循环,它从地图获取数据并将其添加到新地图,该地图将包含来自其他数据源(几个 enumClass)的更多数据。 我是这样做的:
private static Map<String, String> myMapConversion() {
for (myEnunClassKeyOne key : document.keySet()) {
String keyObteined = key.toString();
String value = document.get(key);
globalConfig.put(convertKey(keyToConversion), value); // Extension function get value of myEnunClassKeyOne key
}
return globalConfig;
}
我必须对其他 enumClasses 做同样的事情,并将数据添加到同一个 globalConfig 映射中,如下所示:
private static Map<String, String> mapConversion() {
for (myEnunClassKeyONE key : document.keySet()) {
String keyObteined = key.toString();
String value = document.get(key);
globalConfig.put(convertKey(keyToConversion), value); // Extension function get value of myEnunClassKeyOne key
}
for (myEnunClassKeyTWO key : document.keySet()) {
String keyObteined = key.toString();
String value = document.get(key);
globalConfig.put(convertKey(keyToConversion), value); // Extension function get value of myEnunClassKeyOne key
}
for (myEnunClassKeyTHREE key : document.keySet()) {
String keyObteined = key.toString();
String value = document.get(key);
globalConfig.put(convertKey(keyToConversion), value); // Extension function get value of myEnunClassKeyOne key
}
return globalConfig;
}
重复 for 循环对我来说似乎“不够优雅”。 你能想出一种更自动化的方法吗?
我已经尝试了几种方法,但一直无法正常工作。 它必须是 java 代码,尽管可以接受 Kotlin 扩展函数
提前致谢
--- 根据答案编辑---
@Tenfour04 你真好。
我的问题是 document1、document2 等的类型未经验证,我不知道如何正确键入。 我包括更多细节:
enum class Document1(val currentKey: String) {
color1("blue"),
color1("red"),
color1("green"),
color1("cyan"),
color1("yellow"),
color_show("yes"),
...
}
enum class Document2(val currentKey: String) {
word1("hello"),
word1("sky"),
word1("orange"),
word1("smile"),
word1("beauty"),
word_show("yes"),
...
}
因此,当我在“地图文档”中包含 Document1、Document2 等时,出现必需的类型错误
...
Map<?, ?>[] documents = { Document1, Document2, Document3** };
...
在 Java 中,您可以创建项目列表并对其进行迭代。我假设这些实际上是三个不同的文档。
private static Map<String, String> mapConversion() {
List<Map<?, String>> documents = List.of(document1, document2, document3);
for (Map<?, String> document : documents) {
for (Map.Entry<?, String> entry : document.entrySet()) {
String key = entry.getKey().toString();
String value = entry.getValue();
globalConfig.put(convertKey(keyToConversion), value);
}
}
return globalConfig;
}
在 Kotlin 中,您可以使用 mapKeysTo
:
fun mapConversion(): MutableMap<String, String> {
listOf(document1, document2, document3).forEach {
it.mapKeysTo(globalConifg) { (key, _) -> convertKey(key.toString()) }
}
return globalConfig
}
抱歉,我错过了 Android 标签。 Pre-Java 9 你可以使用数组,但我认为你必须转换返回值:
private static Map<String, String> mapConversion() {
Map<?, ?>[] documents = { document1, document2, document3 };
for (Map<?, ?> document : documents) {
for (Map.Entry<?, String> entry : document.entrySet()) {
String key = entry.getKey().toString();
String value = (String)entry.getValue();
globalConfig.put(convertKey(keyToConversion), value);
}
}
return globalConfig;
}
由于它们是枚举定义而不是映射,您需要一种方法来一般地对它们进行相同的处理。一种方法是添加一种方法来从它们中的每一个获取地图。在每个枚举中都这样:
enum class Document1(val currentKey: String) {
color1("blue"),
color1("red");
companion object {
@JvmStatic val valuesMap: Map<String, Document1>() =
values().associateBy(Document1::currentKey)
}
}
然后你就可以使用地图了:
Map<?, ?>[] documents = { Document1.getValuesMap(), Document2.getValuesMap(), Document3.getValuesMap() };
在这种情况下,地图值是各种枚举类型,因此您可能必须使用 toString()
将它们转换为字符串才能将它们放入全局地图中。