NaNの扱いがイマイチ分からんのです
scala> val l = List(1.0, 2.0, Double.NaN, 3.0) l: List[Double] = List(1.0, 2.0, NaN, 3.0) // == だとフィルタされない scala> l.filterNot(_ == Double.NaN) res0: List[Double] = List(1.0, 2.0, NaN, 3.0) // equals だとフィルタされる scala> l.filterNot(_.equals(Double.NaN)) res2: List[Double] = List(1.0, 2.0, 3.0) // Double型だと == / equals で同じ動作 scala> l.filterNot(_ == 2.0) res3: List[Double] = List(1.0, NaN, 3.0) scala> l.filterNot(_.equals(2.0)) res4: List[Double] = List(1.0, NaN, 3.0)
原因が分かったけれども
理由が分からん!
コメントへの返信:xuweiさん
ご指摘ありがとうございます。
scalaの==/equalsメソッドの仕様かと疑っていたので、まさかJava絡みだったとは。
小さなJavaコードを作成して、動作を確かめてみました。
コメントへの返信:awekuitさん
コメントありがとうございます。
scalaでは isNaN メソッドがあるんですね。
可読性もあっていいと思うので、これからはこっちを使おうと思います。