[JAVA] Ich möchte die praktischen Funktionen von Clojure in Kotlin nutzen

Einzigartig für funktionale Sprachen? Ich habe untersucht und erstellt, wie die Listenoperationsfunktion von Kotlin verwendet wird.

Eine Liste erstellen

range.clj


(def list1 (range 1 6))
(def list2 [6 6 7 8 7 7])

range.kt


val list1 = IntRange(1, 5)
val list2 = listOf(6, 6, 7, 8, 7, 7)

Kotlin ist ein geschlossener Bereich, nicht wahr?

Listenverkettung

concat.clj


(conj list2 10)
(concat list1 list2)

concat.kt


list2 + 10
list1 + list2

Unendliche Liste

repeat.clj


(->> (repeat 123) (take 3))
(->> (iterate #(* 4 %) 3) (take 3))

repeat.kt


generateSequence { 123 }.take(3)
generateSequence(3) { it * 4 }.take(3)

Listenoperation (grundlegend)

Filtern

filter, remove

filter.clj


(filter even? list1)
(remove even? list1)

filter.kt


list1.filter { it % 2 == 0 }
list1.filterNot { it % 2 == 0 }

some

some.clj


(some #(when (even? %) %) list1)

some.kt


list1.find { it % 2 == 0 }
list1.first { it % 2 == 0 }

Wenn keine der Bedingungen erfüllt ist, gibt find null zurück und löst zuerst eine Ausnahme aus.

Kartierung

map.clj


(map #(* % 2) list1)
(keep #(when (> % 3) (* % 2)) list1)
(map-indexed #(* %1 %2) list1)
(keep-indexed #(when (> % 3) (* % %2)) list1)
(mapcat #(list % (* % %)) list1)

map.kt


list1.map { it * 2 }
list1.mapNotNull { if (it > 3) it * 2 else null }
list1.mapIndexed { i, v -> i * v }
list1.mapIndexedNotNull { i, v -> if (i > 3) i * v else null }
list1.flatMap { listOf(it, it * it) }

Falten

reduce.clj


(reduce #(* %1 %2) input)
(reduce #(* %1 %2) 10 input)
(reduce #(if (> % 20) (reduced %) (* % %2)) input)

reduce.kt


list1.reduce { acc, v -> acc * v }
list1.fold(10) { acc, v -> acc * v },
list1.reduce { acc, v -> if (acc > 20) return@reduce acc else acc * v }

Wenn Sie die Reduzierung in der Mitte stoppen möchten, können Sie die beschriftete Rückgabe verwenden.

Listenoperation (Anwendung)

Die Anzahl der Dinge, die gemacht werden müssen, wird allmählich zunehmen.

Duplikate löschen, aufeinanderfolgende Duplikate löschen

distinct.clj


(distinct list2)
(dedupe list2)

distinct.kt


fun <T> Iterable<T>.dedupe(): List<T> {
    if (count() == 0) return toList()
    return fold(listOf(first())) { acc, v -> if (v != acc.last()) acc + v else acc }
}

list2.distinct()
list2.dedupe()

Mischen

shuffle.clj


(shuffle list2)

shuffle.kt


import java.util.Collections

fun <T> Iterable<T>.shuffle(): List<T> = toMutableList().apply { Collections.shuffle(this) }

list2.shuffle()

bewerben ist bequem, nicht wahr?

Konstruktion der Gruppierungskarte und der Aussehenszählkarte

groupby.clj


(group-by #(mod % 2) list2)
(frequencies list2)

groupby.kt


fun <T> Iterable<T>.frequencies(): Map<T, Int> = groupingBy { it }.eachCount()

list2.groupBy { it % 2 }
list2.frequencies()

Wert Sandwich

interleave.clj


(interleave list1 list2)
(interpose 999 list1)

interleave.kt


fun <T> Iterable<T>.interleave(list: Iterable<T>): List<T> = zip(list).flatMap { it.toList() }

fun <T> Iterable<T>.interpose(sep: T): List<T> =
        zip(Collections.nCopies(count(), sep)).flatMap { it.toList() }.dropLast(1)

list1.interleave(list2)
list1.interpose(999)

Kumulative Berechnung

reductions.clj


(reductions * list1)
(reductions * 10 list1)

reductions.kt


fun <T> Iterable<T>.reductions(function: (T, T) -> T): List<T> {
    if (count() <= 1) return toList()
    return drop(1).reductions(first(), function)
}

fun <T, R> Iterable<T>.reductions(init: R, function: (R, T) -> R): List<R> {
    if (count() == 0) return listOf(init)
    return fold(listOf(init)) { acc, v -> acc + function(acc.last(), v) }
}

list1.reductions { i, j -> i * j }
list1.reductions(10, Int::times)

Teilen Sie die Liste alle n

partition.clj


(partition 3 list1)
(partition-all 3 list1)
(partition 4 2 list1)
(partition-all 4 2 list1)
(partition 4 2 [:a :b] list1)

partition.kt



fun <T> Iterable<T>.partition(n: Int, step: Int = n, pad: List<T> = listOf<T>()): List<List<T>> {
    var tmp = toList()
    return mutableListOf<List<T>>().apply {
        while (tmp.count() >= n) {
            add(tmp.take(n))
            tmp = tmp.drop(step)
        }
        if (!pad.isEmpty() && !tmp.isEmpty())
            add((tmp + pad).take(n))
    }
}

fun <T> Iterable<T>.partitionAll(n: Int, step: Int = n): List<List<T>> {
    var tmp = toList()
    return mutableListOf<List<T>>().apply {
        while (!tmp.isEmpty()) {
            add(tmp.take(n))
            tmp = tmp.drop(step)
        }
    }
}

list1.partition(3)
list1.partitionAll(3)
list1.partition(4,2)
list1.partitionAll(4,2)
list1.partition(4,2,listOf("a","b"))

Kotlins ursprüngliche Partitionsfunktion gibt "Pair <List , List >" zurück, hat also einen anderen Zweck.

Teilen Sie die Liste nach Bedingungen auf

partitionby.clj


(partition-by identity list2)
(partition-by #(> % 7) list2)

partitionby.kt


fun <T, R> Iterable<T>.partitionBy(function: (T) -> R): List<List<T>> {
    if (count() == 0) return listOf()

    return drop(1).fold(listOf(listOf(first()))) { acc, v ->
        if (function(acc.last().last()) != function(v))
            acc + listOf(listOf(v))
        else
            acc.dropLast(1) + listOf(acc.last() + v)
    }
}

list2.partitionBy { it }
list2.partitionBy { it > 7 }

Recommended Posts

Ich möchte die praktischen Funktionen von Clojure in Kotlin nutzen
Ich möchte @Autowired in Servlet verwenden
Ich möchte irgendwann sogar in Kotlin sein
Ich möchte Combine auch in UIKit verwenden.
Ich möchte auch in Laradock Fischschalen verwenden! !!
Ich möchte ES2015 auch in Java verwenden! → (´ ・ ω ・ `)
Ich möchte ein kleines Symbol in Rails verwenden
Ich möchte verschiedene Funktionen mit Kotlin und Java implementieren!
Ich möchte DBViewer mit Eclipse 2018-12 verwenden! !!
[Java Spring MVC] Ich möchte DI in meiner eigenen Klasse verwenden
Ich möchte eine E-Mail in Java senden.
Ich möchte Java8 für jeden mit Index verwenden
Ich möchte APP_HOME an Logback in Gradle übergeben
rsync4j - Ich möchte rsync in Java berühren.
Ich möchte den Wert in Ruby erhalten
Ich möchte so etwas wie "cls" in Java machen
Ich möchte NetBeans auf einem Mac verwenden → Ich kann es verwenden!
Ich möchte eine TraceId in das Protokoll einbetten
Wenn Sie Mockito mit Kotlin verwenden möchten, verwenden Sie Mockito-Kotlin
Ich möchte eine Funktion in der Rails Console definieren
[Android Studio] Ich möchte eine Maven-Bibliothek unter Android verwenden
Ich möchte Bildschirmübergänge mit Kotlin und Java machen!
Ich möchte Schlangenfälle mit Tabellendefinitionen stoppen
Ich möchte in RSpec auf einen GoogleMap-Pin klicken
Ich möchte PowerMock in einer Klasse verwenden, die parametrisierte Tests und gewöhnliche Tests kombiniert
Ich möchte Zeichen konvertieren ...
[Anfänger] Ich möchte die Migrationsdatei ändern.
Ich möchte einen relativen Pfad in einer Situation finden, in der Pfad verwendet wird
Ich möchte mit Ruby (ABC177E) eine schnelle Primfaktorisierung durchführen.
Ich möchte eine Liste mit Kotlin und Java erstellen!
Ich möchte eine Funktion mit Kotlin und Java erstellen!
Ich möchte die Java 8 DateTime-API (jetzt) langsam verwenden.
Ich möchte eine andere Desinfektionsmethode als Ansicht verwenden.
Verwendung von ArgumentMatchern wie Mockitos any () in Kotlin
Selbst in Java möchte ich true mit == 1 && a == 2 && a == 3 ausgeben
Ich möchte eine Parkettdatei auch in Ruby erstellen
Ich habe versucht, eine Webanwendung voller Fehler mit Kotlin zu implementieren
Ich möchte im gespeicherten Zustand zum selben Bildschirm wechseln
Ich möchte FireBase verwenden, um eine Zeitleiste wie Twitter anzuzeigen
Delicate ist praktisch, wenn Sie Teile wiederverwenden möchten
Ich möchte die if-else-Anweisung für bedingte Verzweigungen in Java vereinfachen
Wie man Lombok im Frühling benutzt
ProxyFactory ist praktisch, wenn Sie AOP mit Spring testen möchten!
Ich möchte Swipeback auf einem Bildschirm verwenden, der XLPagerTabStrip verwendet
Ich möchte mit Kotlin und Java zum vorherigen Bildschirm zurückkehren!
Ich habe versucht, Java-Anfänger so einzustellen, dass sie Tastenkombinationen in Eclipse verwenden
Ich möchte einige Eigenschaften als JSON-Strings in Jackson erhalten!
Verwendung von InjectorHolder in OpenAM
Ich möchte Geräte in Rails hinzufügen, kann die Installation jedoch nicht bündeln
Wie verwende ich Klassen in Java?
Ich möchte den oberen Rand in der UITableView von Grouped entfernen (schnell)
[Java] Ich möchte mit dem Schlüssel im Objekt eindeutig arbeiten