重複の可能性:
List.filter のアンダースコア
これは機能します(意図したとおり):
List(true, false, true).filter(_ == true).foreach(println)
しかし、私はこのように書くことはできません:
List(true, false, true).filter(_).foreach(println)
なんで?
重複の可能性:
List.filter のアンダースコア
これは機能します(意図したとおり):
List(true, false, true).filter(_ == true).foreach(println)
しかし、私はこのように書くことはできません:
List(true, false, true).filter(_).foreach(println)
なんで?
@sshaefは正しいです、これは重複しています。ただし、リンクされた回答は非常に冗長であるため、簡単な回答を次に示します。
list.filter(_)
のような展開が期待されますlist.filter(x=>x)
が、Scala コンパイラは と同じように扱いますがlist.filter _
、これはまったく異なります。結果はfilter
、アイデンティティ関数でリストをフィルタリングするのではなく、リストに部分的に適用されます。これは、REPL で試してみると明らかです。
scala> List(true, false, true).filter(_)
res0: (Boolean => Boolean) => List[Boolean] = <function1>
scala> List(true, false, true).filter _
res1: (Boolean => Boolean) => List[Boolean] = <function1>
scala> List(true, false, true).filter(x=>x)
res2: List[Boolean] = List(true, true)
scala> List(true, false, true).filter(identity)
res3: List[Boolean] = List(true, true)
scala> List(true, false, true).filterNot(!_)
res4: List[Boolean] = List(true, true)
!
の前に演算子が含まれているため、最後のケースがどのように機能するかに注意し_
てください。これにより、関数を部分的に適用するために使用するのではなく、匿名引数として使用していることがわかります。
別の角度から言えば、目標が何であるかに応じて、これは同じように短く簡潔です。
for(a <- List(true, false, true) if a) println(a)