【问题标题】:Kotlin foreach objectKotlin foreach 对象
【发布时间】:2020-06-08 18:11:18
【问题描述】:

我有一个对象类,

object Examples {
    const val E = 1
    const val X = 2
    const val A = 3
    const val M = 4
    const val P = 5
    const val L = 6
}

如果我使用

Examples.E

它将引用相关的 const val,但我如何在不单独调用它们的情况下迭代每个 val?

【问题讨论】:

  • @user 是的,我的错,只是一个例子>。

标签: arrays for-loop kotlin foreach


【解决方案1】:

看起来你想要一个枚举:

enum class Example(val intVal: Int) {
    E(1), X(2), A(3), M(4), P(5), L(6);
}

您可以访问特定值,例如 Example.E.intVal。要获取所有值的集合,您可以执行 Example.values()enumValues<Example>()

【讨论】:

    【解决方案2】:

    嗯,最好的方法是使用Enum class

    但是你也可以在你的对象上实现Iterable 接口。在此之后您将能够使用forEach/map/fold/filter 和其他有用的Iterable 扩展功能

    object Examples : Iterable<Int> {
    
        const val E = 1
        const val X = 2
        const val A = 3
        const val M = 4
        const val P = 5
        const val L = 6
    
        override fun iterator(): Iterator<Int> {
            return object : Iterator<Int> {
    
                private var i = 1
    
                override fun hasNext(): Boolean = i <= 6
    
                override fun next(): Int {
                    return when (i++) {
                        1 -> E
                        2 -> X
                        3 -> A
                        4 -> M
                        5 -> P
                        6 -> L
                        else -> error("No such element exeption")
                    }
                }
            }
        }
    }
    
    Examples.forEach {
        println(it)
    }
    

    【讨论】:

    • 实现Iterable 是个好主意。但是,我建议将要迭代的变量存储在某种集合中而不是模式匹配中,因为它会少一些样板
    • 是的,我同意。这是一个有趣的解决方案。我只是想说明对象可以实现接口,通过实现Iterable ,您可以使用 Kotlin 中现有扩展函数的强大功能。
    • 不,我并不是说这很有趣或奇怪,我只是觉得说val vals = listOf(E, X, A ...)然后fun iterator() = vals.iterator()会更容易
    • 所有(几乎所有?)这些Iterable函数也可用于Array,这就是Enum.values。
    【解决方案3】:

    使用 Kotlin,您可以使用反射来获取对象内的所有值。

    但是,您是否考虑过使用Enum class?这似乎更适合您的用例:

    enum class Letter {
            A,
            B,
            C
    }
    

    您可以使用 Letter 获取所有可能的值

    Letter.values()
    

    或者,如果您希望能够按顺序引用重复的元素,则可以使用数组,如果元素始终是字母,则可以只使用字符串。

    另外请记住,您定义了两个名为“E”的值,这是行不通的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-11-11
      • 2016-06-20
      • 1970-01-01
      • 1970-01-01
      • 2021-07-03
      • 1970-01-01
      • 2012-02-07
      相关资源
      最近更新 更多