2016-04-30 36 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?