Code Archive Skip to content Google About Google Privacy Terms
やあ、3月に延期になったとはいえ、Java 8リリースが具体化してきましたね。 もうこれで、Lambdaがはずれるとかいうことはなさそうです。 ところで、Java 8で関数型っぽいことができるようになってうれしいのですが、ちょっと記述が冗長です。ということで、短く書けるおまじない考えてみました。 Function型 さて、まずはJava 8で標準で入ったFunction型をみてみましょう。パッケージ名まで含めるとjava.util.funciton.Functionです。 こんな感じで使います。 Function<String, String> enclose = s -> "[" + s + "]"; Genericsでの型指定の最初が引数、あとが戻り値の型です。ここではStringをとってStringを返す関数としてencloseを定義しています。 これを呼び出そうとすると、こんな感じ
val fruits = List("apple", "banana", "avocado", "papaya") val countsToFruits = // count how many 'a' in each fruit fruits.groupBy(fruit => fruit.count(_ == 'a')) for (count, fruits) <- countsToFruits do println(s"with 'a' × $count = $fruits") // prints: with 'a' × 1 = List(apple) // prints: with 'a' × 2 = List(avocado) // prints: with 'a' × 3 = List(banana, papaya)
当初の目的とはだいぶ違う方向に進んでいってしまいましたが、そのおかげでだいぶJavaという言語に対する知見を深めることができたような気がします。 ということで、そろそろJavaで高階関数を書くテーマに挑戦できそうです。 - まず、ここで考える高階関数として、配列に対する次の3つの関数を挙げます。 collect 配列の各要素に対して操作を加え、その結果を別の配列として返す。 filter 配列の各要素に対してテストを行い、結果が真となったものだけからなる新しい配列を返す。 fold 配列の各要素に対する操作の結果を蓄積する。 この3つは、SICPでは、"2.2.3 Sequences as Conventional Interfaces"のところで、map, filter, accumulateとして登場する関数であり、Smalltalkでは、Collectionクラスの、collect:
この記事は会員登録で続きをご覧いただけます申込は簡単3分! 今すぐ会員登録(無料) 会員の方はこちら 【8/20まで】今なら年額プランが2カ月分お得! 詳しくはこちら ▼日経クロステック有料会員になると… オリジナル記事がすべて読める 専門雑誌7誌の記事も読み放題 雑誌PDFを月100ページダウンロードできる
リリース、障害情報などのサービスのお知らせ
最新の人気エントリーの配信
処理を実行中です
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く