Java 8流限制功能是否有任何等效的Kotlin函数[重复]

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java 8流限制功能是否有任何等效的Kotlin函数[重复]相关的知识,希望对你有一定的参考价值。

这个问题在这里已有答案:

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

val arr = 0 until 20

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

一切都很好,直到我意识到它过滤整个列表,无论是否找到了这两个元素。

使用Java 8 stream api,它按预期工作。

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

所以我的问题是如果只使用Kotlin功能就可以实现。

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

答案

默认情况下,Kotlin急切地进行这些操作,而Java中的Streams则是懒惰的。如果使用sequences,可以在Kotlin中使用相同的行为,Array可以很容易地从Iterables或asSequence()s生成arr.asSequence().filter { i -> println("Filter: $i") i % 2 == 0 }.take(2).toList() //Filter: 0 //Filter: 1 //Filter: 2

here

请注意,序列必须最终转换回列表。

你可以阅读有关详细信息val arr: IntRange = 0 until 20 val res: List<Int> = arr .asSequence() .filter { i -> println("Filter: $i") i % 2 == 0 } .take(2) .toList() // Prints Filter: 0 Filter: 1 Filter: 2 And res == [0, 2]

另一答案

通过使用序列,您可以像Java 8流一样进行延迟评估。我用懒惰的序列和显式类型重写了你的例子(我没有更改它们,我只是为了清楚而声明它们):

arr

通过将filter变成一个序列,执行你的takelimit(就像Java的the documentation for Sequence),然后把它变成List,它会懒散地执行。

来自qazxswpoi:

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

以上是关于Java 8流限制功能是否有任何等效的Kotlin函数[重复]的主要内容,如果未能解决你的问题,请参考以下文章

对于 std::tr1::unordered_map,是不是有任何等效的 std::algorithm 类似于 std::map::lower_bound?

Azure Synapse 专用 SQL 池中的“sp_refreshview”是不是有任何等效项

Python 中 Java 的 Mahout 等价物

在 swift/objective c 中是不是有任何等效于 getServingUrl() 的方法?

在 Powerpc 上,是不是有任何等效于英特尔的 movemask 内在函数?

在 Java OpenCV 中替换像素的等效代码