Scala dropWhile vs过滤器
为什么??我希望两者的输出相同。Scala dropWhile vs过滤器,scala,filter,functional-programming,iterator,Scala,Filter,Functional Programming,Iterator,为什么??我希望两者的输出相同。dropWhile丢弃条件为true的集合开始时的所有项。一旦第一项不符合条件,它就会停止丢弃 filter丢弃整个集合中条件不正确的所有项。它直到收集结束才停止 在您的情况下,dropWhile会删除1,但在到达2时会停止,因为条件\u%2!=0为false 另一方面,filter会删除所有\uU%2==0为假的值,这些值都是奇数。dropWhile是takeWhile的否定版本(因此名称类似),而不是filter@sepp2k我不明白你的评论是如何解释上述输出
dropWhile
丢弃条件为true
的集合开始时的所有项。一旦第一项不符合条件,它就会停止丢弃
filter
丢弃整个集合中条件不正确的所有项。它直到收集结束才停止
在您的情况下,dropWhile
会删除1
,但在到达2
时会停止,因为条件\u%2!=0
为false
另一方面,
filter
会删除所有\uU%2==0
为假的值,这些值都是奇数。dropWhile
是takeWhile
的否定版本(因此名称类似),而不是filter
@sepp2k我不明白你的评论是如何解释上述输出的。“dropWhile是takeWhile的否定版本”-好的,那么?您的第二个版本与第一个版本有两个不同:您使用的是过滤器而不是dropWhile
,并且您否定了传递给它的条件。您说您希望两个版本的行为相同,因此在我看来,您认为dropWhile
的行为类似于filter
,但有一个否定的条件(因此,如果您否定该条件,您将从这两个版本获得相同的结果)。但它的行为不像带有否定条件的filter
——它的行为就像带有否定条件的takeWhile
。如果在第二个版本中将filter
替换为takeWhile
,则其作用与第一个版本相同。@sepp2k“其作用类似于带否定条件的takeWhile
”——但在这种情况下,它似乎不起任何作用。让我这样问一下-您是如何仅使用takeWhile
和dropWhile
获得与第二个相同的输出的?当然,它会做一些事情:它会删除1。“你是如何只使用takeWhile和dropWhile获得与第二个相同的输出的?”我不这么认为takeWhile
/dropWhile
和filter
/filterNot
做不同的事情,在当前情况下使用您想要的行为。你不能真的模仿一个人和另一个人的行为,你为什么要这样做呢?当你可以首先使用你想要的一个的时候?我明白了。现在Scaladoc也有意义了:dropWhile
-跳过这个迭代器中满足给定谓词p的最长元素序列。因此,正如@sepp2k所说,在构造时,仅使用*不可能获得第二个输出。
val xs = Iterator
.from(1)
.dropWhile(_ % 2 != 0)
.takeWhile(_ < 10)
.toList
val ys = Iterator
.from(1)
.filter(_ % 2 == 0)
.takeWhile(_ < 10)
.toList
println(xs)
println(ys)
List(2, 3, 4, 5, 6, 7, 8, 9)
List(2, 4, 6, 8)