2016-04-30 7 views
5
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); 
    } 
} 

Nel codice di cui sopra che sto cercando di convertire la seguente rigaJava 8 lambda per Kotlin lambda

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

in codice Kotlin. L'editor online Kotlin mi fornisce il seguente codice

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

che genera errore di compilazione quando provo a eseguirlo.

come risolvere questo problema ???

o che cosa è il modo Kotlin ottenere l'elenco di stringa dalla lista di oggetto account

collezioni
+1

E l'errore è? –

+0

flusso di riferimento non risolto, riferimento irrisolto Collettori – Mahabub

+0

Quindi il problema non è il lambda. Il problema è che le raccolte di Kotlin non hanno un metodo stream(). Vedere https://youtrack.jetbrains.com/issue/KT-5175 –

risposta

10

Kotlin non hanno un metodo di stream().

Come accennato in https://youtrack.jetbrains.com/issue/KT-5175, è possibile utilizzare

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

oppure è possibile utilizzare una delle alternative Kotlin nativi che non utilizzano corsi d'acqua, di cui le risposte alle this question:

val list = data1.map { it.name } 
0

Come dice @JBNizet, non utilizzare affatto i flussi, se si sta convertendo in Kotlin quindi convertire completamente:

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

a

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

e in altri casi, troverete che altri tipi di raccolta possono diventare liste semplicemente con toList() o ad un insieme di toSet() e così via. E tutto negli Stream ha già un equivalente nel runtime di Kotlin.

Non c'è alcun bisogno di Java 8 Streaming con Kotlin, sono più prolissi e non aggiungono alcun valore.

Per più sostituti per evitare Streams, leggere: What Java 8 Stream.collect equivalents are available in the standard Kotlin library?

si dovrebbe leggere il seguente così:

E forse questo è un duplicato di: How can I call collect(Collectors.toList()) on a Java 8 Stream in Kotlin?