繁体   English   中英

如何在Kotlin字符串模板中嵌入循环

[英]How to embed for loops in Kotlin string templates

我们可以很容易地嵌套表达式运算符,如ifwhen在Kotlin字符串模板中:

"List ${if (list.isEmpty()) "is empty" else "has ${list.size} items"}."

forwhile不是表达式,不能嵌套在模板中,如下所示:

"<ol>${for (item in list) "<li>$item"}</ol>"

所以我一直在寻找在大型模板中使用循环的方便方法。

到目前为止,我发现的最简单的开箱即用方法是用等效的joinToString调用替换循环:

"<ol>${list.joinToString("") { "<li>$it" }}</ol>"

要么

"""
<ol>${list.indices.joinToString("") {
    """
    <li id="item${it + 1}">${list[it]}"""
}}
</ol>""".trimIndent()

在优先级方面,也可以使用辅助函数模拟循环:

inline fun <T> forEach(iterable: Iterable<T>, crossinline out: (v: T) -> String) 
    = iterable.joinToString("") { out(it) }

fun <T> forEachIndexed1(iterable: Iterable<T>, out: (i: Int, v: T) -> String): String {
    val sb = StringBuilder()
    iterable.forEachIndexed { i, it ->
        sb.append(out(i + 1, it))
    }
    return sb.toString()
}

并像这样使用它们:

"<ol>${forEach(list) { "<li>$it" }}</ol>"

要么

"""
<ol>${forEachIndexed1(list) { i, item ->
"""
    <li id="item$i">$item"""
}}
</ol>""".trimIndent()

你可以简单地使用joinToString

val s = """<ol>
             ${list.joinToString { "<li>$it</li>" }}
           </ol>""";

产量

<ol>
   <li>one</li>
   <li>two</li>
   ...
</ol>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM