是否有任何相当于Java 8 Stream限制function的Kotlin函数?

我试图find符合条件(过滤)的列表中的前两个元素,为此,我已经在kotlin中实现了以下代码片段:

val arr = 0 until 20 val res = arr.filter { i -> println("Filter: $i") i % 2 == 0 }.take(2) 

一切都很好,直到我意识到它通过整个清单过滤,无论是否find了这两个元素。

利用Java 8流API,它按预期工作。

 val res2 = arr.toList().stream() .filter { i -> println("Filter: $i") i % 2 == 0 }.limit(2) 

所以我的问题是,如果只能使用Kotlin函数来实现。

我知道我可以使用一个简单的循环,但我想使用一个函数式编程aproach。

2 Solutions collect form web for “是否有任何相当于Java 8 Stream限制function的Kotlin函数?”

Kotlin在默认情况下会热切地执行这些操作,而Java中的Streams懒惰的 。 如果您使用序列 (可以很容易地从Array s生成)或者使用asSequence() Iterable s生成序列 ,那么您可以在Kotlin中拥有相同的结果。

 arr.asSequence().filter { i -> println("Filter: $i") i % 2 == 0 }.take(2).toList() //Filter: 0 //Filter: 1 //Filter: 2 

请注意,序列最后必须转换为列表。

你可以在这里阅读有关细节。

通过使用一个序列,你可以得到像Java 8流一样的惰性评估。 我用懒惰的顺序和显式types重写了你的例子(我没有改变它们,为了清楚起见,我只是宣布它们):

 val arr: IntRange = 0 until 20 val res: List = arr .asSequence() .filter { i -> println("Filter: $i") i % 2 == 0 } .take(2) .toList() // Prints Filter: 0 Filter: 1 Filter: 2 And res == [0, 2] 

通过将arr转换成一个序列,执行你的filtertake (这就像Java的limit ),然后把它变成一个List,它将会懒惰地执行。

从序列的文档 :

通过其迭代器返回值的序列。 这些值是懒惰地评估的,序列可能是无限的。

  • Kotlin NullPointerException发生
  • Kotlin - 如何为RecyclerVIew实现ItemClickListener
  • Kotlin - 使用枚举来检索一个字符
  • 什么是Kotlin后台?
  • 如何将字符串数组转换为Int数组在Kotlin?
  • Dagger2和Kotlin运行失败的原因是:app:compileDebugKotlinAfterJava
  • Kotlin删除所有非字母数字字符
  • 在Kotlin的意图
  • Spring REST,Kotin和默认的基本参数导致错误
  • 阿卡流,上游不产生价值
  • 匕首不能提供注射Kotlin
  • Kotlin language will be the best programming language for Android.