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

在上面的代碼我想下面的行的Java 8 lambda來科特林拉姆達

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) 

當我嘗試運行它時出現編譯錯誤。

如何解決這個問題?

或什麼科特林方式來獲得字符串列表從帳戶對象的列表

+1

而錯誤是? –

+0

unresolve參考流,unresolve參考收藏家 – Mahabub

+0

所以問題不是lambda。問題是Kotlin集合沒有stream()方法。請參閱https://youtrack.jetbrains.com/issue/KT-5175 –

回答

10

科特林藏品沒有stream()方法。

正如https://youtrack.jetbrains.com/issue/KT-5175提到, 可以使用

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

,或者您可以使用不使用流的原生科特林選擇之一,在回答上市this question

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

正如@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運行時中具有相同的功能。

Kotlin完全不需要Java 8 Streams,它們更加冗長且不增加任何價值。

更多的替代品,以避免流,讀:What Java 8 Stream.collect equivalents are available in the standard Kotlin library?

你應該閱讀下列以及:

也許這是一個重複的:How can I call collect(Collectors.toList()) on a Java 8 Stream in Kotlin?