在一次执行中使用不同的参数制作多个 "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() 将它们转换为字符串才能将它们放入全局地图中。