Функция Kotlin map возвращает Stream и не является эквивалентом Java для collect () - PullRequest
1 голос
/ 22 января 2020

map возвращает поток вместо List<Media>. Так что назначение product.media = cleanedMedia не будет работать. Я должен использовать collect здесь, чтобы это работало. Но я часто видел, как люди говорили, что map эквивалентно collect для Java. (здесь указано, например: https://www.baeldung.com/java-8-stream-vs-kotlin)

    fun cleanup(product: Product) {
        val cleanedMedia = product.media.stream()
                .filter { "failed" == it.purpose }
                .map {it}
        product.media = cleanedMedia
    }

Ответы [ 3 ]

1 голос
/ 22 января 2020

Используйте только Kotlin List

В вашем классе Product обязательно удалите import java.util.List, чтобы использовать список Kotlin.

class Product {
  var media: List<Media> = listOf()
}

Затем вы можете просто написать следующее:

fun cleanup(product: Product) {
  product.media = product.media.filter { "failed" == it.purpose }
}
0 голосов
/ 22 января 2020

Я вообще ничего не вижу, например,

Карта является эквивалентом для сбора Java

на связанной странице. Единственное упоминание о collect:

Одно из преимуществ этого заключается в том, что нет необходимости в первоначальном преобразовании из коллекции в поток, и нет необходимости в окончательном преобразовании из потока обратно в коллекцию - с помощью вызовов collect ().

и map() - только пример; в равной степени это может быть filter, flatMap, некоторая их последовательность и т. д. c.

Таким образом, говорится, что stream() и collect(Collectors.toList()) могут быть выброшены (но только вместе!) и, возможно, некоторые методы должны быть переименованы.

0 голосов
/ 22 января 2020

Но я часто видел, как люди говорили, что map эквивалентно collect для Java.

Прежде всего: kotlin имеет несколько схем для итерации элемента :

  • По умолчанию: с материализованным сбором. Например, все операторы возвращают окончательную коллекцию, например - map .
  • Kotlin Последовательности: они похожи на Java потоки, например, они возвращают ленивый итератор. Пожалуйста, проверьте такие же методы здесь .
  • Kotlin Сопрограммы также имеют функцию карты . Это оператор потоковой передачи и возвращает Flux.

Поэтому: * Kotlin Sequence выглядит как Java Streams, однако при компиляции байт-код готовится. Так что формально реализация отличается. * В большинстве случаев материализованная карта быстрее и проще, поэтому ее лучше использовать.

...