少年易酔學難成

IT/技術的な話題について書きます

Scalaでもパイプラインできるもん!

Elixirのパイプライン演算子が羨ましくなったので作ってみました。

と言っても、こいつ↓でオブジェクトにパイプライン演算子を生やすだけです。

implicit class Pipe[A](value: A) {
  def |>[B](f: A => B): B = f(value)
}

こんな感じでかけます。

List(List(1,2,3),List(4),List(5)) |> (_.flatten) |> (_.map(Math.pow(_, 2))) // => List(1, 4, 9, 16, 25)

見易く演算子の前で改行を入れる場合はそのままだとエラーになるので、ちょっとカッコ悪いですが.を入れましょう。

List(List(1,2,3),List(4),List(5))
  .|> (_.flatten)
  .|> (_.map(Math.pow(_, 2))) // => List(1, 4, 9, 16, 25)

メソッドチェーンとは違い(メソッドだけでなく)関数のチェーンを型注釈なしで書けるので、割と使い勝手が良さそう。 値クラスに出来ればもっと良いのだけれど。