Dapatkah saya menggabungkan penutupan di bawah ini menjadi satu atau melakukan ini dengan cara yang lebih fungsional dan elegan di groovy. Saya menggunakan sortMethod di beberapa tempat lain (untuk tujuan pengujian) juga.

Misalnya: countAndMap harus mengambil ["a b c a a c" , "b b c"] dan kembali[x1 : [a:3,c:2,b:1] , x2 : [b:2,c:1]]

def countAndMap(List<String> stringList) {
    stringList.withIndex().collect { String s, Integer i -> [(num.call(i)): count.call(s)] }
}


Closure count = {sortMethod.call(it.split().countBy {it}) }

Closure sortMethod = { it.sort { x, y -> x.value <=> y.value } }

Closure num  = { "x ${it + 1}".toString()}

Tidak ada kesalahan tetapi saya ingin tahu apakah mungkin melakukannya dengan cara yang lebih fungsional

0
sha 9 Agustus 2019, 03:58

1 menjawab

Jawaban Terbaik

Saya tidak yakin apa yang Anda maksud dengan "lebih fungsional", tetapi Anda dapat menggunakan operasi lipat (disebut menyuntikkan dalam asyik):

list = ["a b c a  a c" , "b b c"]
def createSortedHistogram(String toCount) {
    toCount
      .split() // Create list of words
      .inject([:]){ acc, word -> acc[word] = 1 + (acc[word] ?: 0);acc} // create histogram
      .sort{-it.value} // sort histogram map by value desc
}

def countAndMap(List<String> list) {
    list.withIndex().collectEntries{ sublist, i -> ["x ${i+1}": createSortedHistogram(sublist)] }
}
countAndMap(list)

Saya pikir bagian yang paling menarik adalah metode inject. Solusi ini menggunakan nilai awal [:] untuk menggunakan peta sebagai hasilnya. Dalam setiap iterasi, operasi inject menambahkan entri baru dengan nilai 1 ke peta (jika kata/kunci tidak ada di peta) atau menambah nilai kata/kunci jika sudah ada di peta. peta.

Lihat definisi inject dari Collections GroovyDoc.

public Object inject(Object initialValue, Closure closure) - Iterasi melalui Koleksi yang diberikan, meneruskan nilai awal ke penutupan 2-arg bersama dengan item pertama. Hasilnya dilewatkan kembali (disuntikkan) ke dalam penutupan bersama dengan item kedua. Hasil baru disuntikkan kembali ke dalam penutupan bersama dengan item ketiga dan seterusnya sampai seluruh koleksi telah digunakan. Juga dikenal sebagai foldLeft atau reduce dalam bahasa fungsional.

0
m273d15 9 Agustus 2019, 12:36