最近以下のようなJava8の記事
をちょくちょく見かけるようになったので、自分もなにか書こうと思い、前からちょっとだけ気になっていた、highjというライブラリ
https://code.google.com/p/highj/
https://github.com/svn2github/highj/tree/master/branches/java8/src/main/java/org/highj
を読んでみて、概要を書いてみます。
Javaで関数型プログラミングというと、functional java
https://github.com/functionaljava/functionaljava
という、一年くらい前にちょっとblogにも書いたものがあります。
http://d.hatena.ne.jp/xuwei/20120427/1335542461
で、今回なぜhighjを紹介するのかというと、
highjがJava8対応をはじめているからです(functional javaのほうは、そういう話がまだほとんどでてこないfunctional javaも対応したようです)
highjが実用的かどうか?とか、いやそれScalaで(ryとかいう観点で書くのは考えるのが面倒なので、そうではなく、highjがどれほど徹底していて変態的なのかを中心に書いてみようかと思います。
typeclassの種類が豊富
まぁ、とにかくこれにつきますね。functional Javaとくらべても(場合によってはScalazよりも)明らかに多いです。
「そんなものまであって、実際使いやすいの?」
という疑問は残りますが・・・。まずこれを書いている時点でのtypeclass一覧を列挙してみます。
data structure
かなり基本的なものだけある感じ。もっとあってもいいと思う
higher order type polymorphismをsimulationするためのなにか
以下のような、明らかに怪しそうな名前のものがあります。
- _.java
- __.java
- ___.java
- ____.java
コメントには
An interface for "lifting" a type constructors to type parameter level in order to allow the simulation of higher order type polymorphism. The "hidden" class µ (which should be an inner static class of the type constructor with a private constructor) identifies the type class and allows to cast values back to their normal version. For this, the type constructor should provide a static method called narrow.
と書いてあります。もうちょっと調べないとよくわからなそうなので、まぁ気が向いたらあとで書きます。あと、
HigherKinded.java
というものもあったりします・・・。
あとは、色々ユーティリティがあったり、「まぁJavaで関数型プログラミングやるなら必要になるだろうな」という、上記のtypeclassに比べたら当たり前の機能(?)がある感じです。(functional javaにもある程度似たようなものある)
とにかくtypeclassは豊富だけれども、それ以外はまだまだ細かいもの足りなそうなので、頑張って欲しいですね。
単に列挙して紹介しただけでしたが、testのディレクトリ以下に、実際の使い方のコード例それなりにあるので、
興味が湧いた人は見てみればいいとおもいます。
あと実装に関しても、lambdaはもちろん、メソッド参照や、interfaceのデフォルト実装などをふんだんに使ってて、Java8のコード例として面白いとおもいます。