[JAVA] Je souhaite utiliser les fonctions pratiques de Clojure dans Kotlin

Unique aux langages fonctionnels? J'ai étudié et créé comment utiliser la fonction d'opération de liste de Kotlin.

Construire une liste

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 est une gamme fermée, n'est-ce pas?

Concaténation de liste

concat.clj


(conj list2 10)
(concat list1 list2)

concat.kt


list2 + 10
list1 + list2

Liste infinie

repeat.clj


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

repeat.kt


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

Opération de liste (basique)

filtration

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 }

Si aucune des conditions n'est remplie, find renvoie null et déclenche d'abord une exception.

cartographie

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) }

Plier

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 }

Si vous souhaitez arrêter de réduire au milieu, vous pouvez utiliser le retour étiqueté.

Opération de liste (application)

Le nombre de choses à faire augmentera progressivement.

Supprimer les doublons, supprimer les doublons consécutifs

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()

mélanger

shuffle.clj


(shuffle list2)

shuffle.kt


import java.util.Collections

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

list2.shuffle()

appliquer est pratique, n'est-ce pas?

Construction d'une carte de regroupement et d'une carte de comptage d'apparences

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()

Sandwich de valeur

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)

Calcul cumulatif

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)

Diviser la liste tous les 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"))

La fonction de partition d'origine de Kotlin renvoie Pair <List <T>, List <T >>, donc elle a un but différent.

Divisez la liste selon les conditions

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

Je souhaite utiliser les fonctions pratiques de Clojure dans Kotlin
Je veux utiliser @Autowired dans Servlet
Je veux être finalement même à kotlin
Je souhaite également utiliser Combine dans UIKit.
Je veux aussi utiliser des coquillages à Laradock! !!
Je veux aussi utiliser ES2015 avec Java! → (´ ・ ω ・ `)
Je veux utiliser une petite icône dans Rails
Je veux implémenter diverses fonctions avec kotlin et java!
Je souhaite utiliser DBViewer avec Eclipse 2018-12! !!
[Java Spring MVC] Je souhaite utiliser DI dans ma propre classe
Je souhaite envoyer un e-mail en Java.
Je veux utiliser java8 forEach avec index
Je souhaite transmettre APP_HOME pour me connecter à Gradle
rsync4j --Je veux toucher rsync en Java.
Je veux obtenir la valeur en Ruby
Je veux faire quelque chose comme "cls" en Java
Je veux utiliser NetBeans sur Mac → Je peux l'utiliser!
Je veux intégrer n'importe quel TraceId dans le journal
Si vous souhaitez utiliser Mockito avec Kotlin, utilisez mockito-kotlin
Je souhaite définir une fonction dans la console Rails
[Android Studio] Je souhaite utiliser une bibliothèque Maven sur Android
Je veux faire des transitions d'écran avec kotlin et java!
Je veux arrêter les cas de serpent avec des définitions de table
Je veux cliquer sur une broche GoogleMap dans RSpec
Je souhaite utiliser PowerMock dans une classe qui combine des tests paramétrés et des tests ordinaires
Je veux convertir des caractères ...
[Débutant] Je souhaite modifier le fichier de migration-Comment utiliser la restauration-
Je veux trouver un chemin relatif dans une situation où Path est utilisé
Je souhaite effectuer une factorisation prime rapide avec Ruby (ABC177E)
Je veux faire une liste avec kotlin et java!
Je veux créer une fonction avec kotlin et java!
Je souhaite utiliser l'API Java 8 DateTime lentement (maintenant)
Je souhaite utiliser la méthode de désinfection autre que View.
Comment utiliser ArgumentMatchers tels que Mockito's any () dans Kotlin
Même en Java, je veux afficher true avec un == 1 && a == 2 && a == 3
Je veux créer un fichier Parquet même en Ruby
J'ai essayé d'implémenter une application web pleine de bugs avec Kotlin
Je souhaite passer au même écran dans l'état enregistré
Je souhaite utiliser FireBase pour afficher une chronologie comme Twitter
Delicate est pratique à utiliser lorsque vous souhaitez réutiliser des pièces
Je souhaite simplifier l'instruction if-else de la branche conditionnelle en Java
Comment utiliser Lombok au printemps
ProxyFactory est pratique lorsque vous souhaitez tester AOP avec Spring!
Je souhaite utiliser le balayage arrière sur un écran qui utilise XLPagerTabStrip
Je veux revenir à l'écran précédent avec kotlin et java!
J'ai essayé de configurer les débutants Java pour qu'ils utilisent des touches de raccourci dans eclipse
Je veux obtenir des propriétés sous forme de chaînes JSON dans Jackson!
Comment utiliser InjectorHolder dans OpenAM
Je veux ajouter un appareil dans Rails, mais je ne peux pas grouper l'installation
Comment utiliser les classes en Java?
Je veux supprimer la marge supérieure dans UITableView de Grouped (swift)
[Java] Je veux effectuer distinctement avec la clé dans l'objet