簡體   English   中英

Groovy:為List中的每個String添加前綴

[英]Groovy: Add prefix to each String in a List

給出以下列表:

List<String> list = ["test1", "test2", "test3"]

現在我想以下列格式從這個列表中創建一個String:

"pre/test1 pre/test2 pre/test3"

所以我想我會采取以下方式:

println list.each { "pre/$it" }.join(' ')

但是,這會導致以下輸出:

"test1 test2 test3"

(注意缺少的前綴。)
如何在Groovy中實現所需的字符串連接?

def joined = ["test1", "test2", "test3"].collect { "pre/$it" }.join(' ')

each返回未修改的集合 - 而collect返回帶有修改內容的集合。

對於大型列表(這里顯然不是這種情況),直接形成字符串更有效:

 def sb = ["test1", "test2", "test3"].inject(new StringBuilder()) { builder, value -> builder << "pre/${value} " } sb.setLength(sb.size() - 1) // to trim the trailing space 

事實證明,情況正好相反。 以下是一些使用1000萬個元素的測試運行,在多次運行中跟蹤CPU和實時:

import java.lang.management.ManagementFactory

def threadMX = ManagementFactory.threadMXBean
assert threadMX.currentThreadCpuTimeSupported
threadMX.threadCpuTimeEnabled = true

def timeCPU = { Closure c ->
    def start = threadMX.currentThreadCpuTime
    def result = c.call()
    def end = threadMX.currentThreadCpuTime
    println "CPU time: ${(end - start)/1000000000} s"
}

def timeReal = { Closure c ->
    def start = System.currentTimeMillis()
    def result = c.call(args)
    def end = System.currentTimeMillis()
    println "Elapsed time: ${(end - start)/1000} s"
    result
}

def theList = (0..<10000000). collect { it.toString() }

[CPU:timeCPU, Real:timeReal].each { label, time ->
    println "\n\n$label Time"

    print ("Mine: ".padLeft(20))
    def s2 = time {
        def sb = theList.inject(new StringBuilder()) { builder, value ->
            builder << "pre/${value} "
        }
        sb.setLength(sb.size() - 1)
        sb.toString()
    }

    print ("cfrick's: ".padLeft(20))
    def s3 = time {
        def sb = theList.inject(new StringBuilder()) { builder, value ->
            builder << "pre/" << value << " "
        }
        sb.setLength(sb.size() - 1)
        sb.toString()
    }

    print ("Opal's: ".padLeft(20))
    def s1 = time { theList.collect { "pre/${it}" }.join(" ") }

    print "Opal's w/o GString: "
    def s4 = time { theList.collect { "pre/" + it }.join(" ") }

    assert s1 == s2 && s2 == s3 && s3 == s4
}

以下是結果:

CPU Time
              Mine: CPU time: 12.8076821 s
          cfrick's: CPU time: 2.1684139 s
            Opal's: CPU time: 3.5724229 s
Opal's w/o GString: CPU time: 3.1356201 s


Real Time
              Mine: Elapsed time: 15.826 s
          cfrick's: Elapsed time: 3.587 s
            Opal's: Elapsed time: 8.906 s
Opal's w/o GString: Elapsed time: 6.296 s

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM