Java 8 lambda to kotlin lambda

public class Main { static class Account { private Long id; private String name; private Book book; public Account(Long id, String name, Book book) { this.id = id; this.name = name; this.book = book; } public String getName() { return name; } } public static void main(String[] args) { List<Account> data1 = new ArrayList<>(); data1.add(new Account(1L,"name",null)); List<String> collect = data1.stream().map(account -> account.getName()).collect(Collectors.toList()); System.out.println(collect); } } 

В приведенном выше коде я пытаюсь преобразовать следующую строку

 List<String> collect = data1.stream().map(account -> account.getName()).collect(Collectors.toList()); 

в котлинский код. Редактор Kotlin онлайн дает мне следующий код

  val collect = data1.stream().map({ account-> account.getName() }).collect(Collectors.toList()) println(collect) 

который дает ошибку компиляции, когда я пытаюсь запустить ее.

как исправить это ???

или что такое kotlin способ получить список строк из списка объекта Account

Коллекции Котлина не имеют метода stream() .

Как упоминалось в https://youtrack.jetbrains.com/issue/KT-5175 , вы можете использовать

 (data1 as java.util.Collection<Account>).stream()... 

или вы можете использовать одну из родных альтернатив Kotlin, которые не используют потоки, перечисленные в ответах на этот вопрос :

 val list = data1.map { it.name } 

Как говорит @JBNizet, вообще не используйте потоки, если вы конвертируете в Kotlin, а затем конвертируете полностью:

 List<String> collect = data1.stream().map(account -> account.getName()).collect(Collectors.toList()); 

в

 val collect = data1.map { it.name } // already is a list, and use property `name` 

и в других случаях вы обнаружите, что другие типы коллекций могут стать списками просто с помощью toList() или с набором как toSet() и так далее. И все в Streams уже имеет эквивалент в исполнении Kotlin.

Нет необходимости в Java 8 Streams вообще с Kotlin, они более подробные и не добавляют никакой ценности.

Для большей замены, чтобы избежать потоков, читайте: Какие эквиваленты Java 8 Stream.collect доступны в стандартной библиотеке Kotlin?

Вы также должны прочитать следующее:

  • Ссылка API Kotlin для kotlin.collections
  • Ссылка API Kotlin для kotlin.sequences

И, возможно, это дубликат: Как я могу вызвать collect (Collectors.toList ()) на Java 8 Stream в Котлине?