関数型の書き方に早く慣れ親しみたいので、 Java による関数型プログラミング を買ってみました.
- Javaによる関数型プログラミング ―Java 8ラムダ式とStream - Venkat Subramaniam
今日は、簡単な演算を stream で実施するとどうやるかをいろいろ実験してみました.
forEach
forEach は 各ストリーム要素に大してなんらかの操作をすることができる.
表示
print 表示してみる.
import java.util.*;
class StreamSample {
public static void main(String args[]) {
List<Integer> list = Arrays.<Integer>asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
list.stream().forEach(i -> System.out.print(i + " "));
}
}
// 1 2 3 4 5 6 7 8 9 10
reduce
集合から単一の値を求める.
すべての合計を求める
sum()と average()などによる集計の機能は Stream には用意されていない. mapToInt()をつかうことで、Integer 型を int 型に変換する.
int sum = list.stream()
.mapToInt(x -> x)
.sum();
System.out.println(sum);
最大値を求める
int max = list.stream()
.mapToInt(x -> x)
.max()
.orElse(0);
System.out.println(max);
すべての積を求める
とくに、専用メソッドはないようだ. reduce メソッドで実装する.
int multiple = list.stream()
.mapToInt(x -> x)
.reduce(1, (a, b) -> a * b);
System.out.println(multiple);
filter
filter を用いることで、if 文相当のことができる.
// 奇数のみの足し算
int sum2 = list.stream()
.mapToInt(x -> x)
.filter(i -> i % 2 == 1)
.sum();
System.out.println(sum2);
おわりに
以上、簡単に書籍を参考にしながらコードを動かしてみた.
java で関数型プログラミングを学ぶと、慣れ親しんだ言語ということでとっつきやすい.
しかし、関数型ならば Java じゃなくて Scala とか、本格的な言語で学んだほうがよいのではないかというジレンマもある.
当初の目論見では、TopCoder の問題を関数型で書き直して学ぼうとおもったけれども、 TopCoder の問題は思った以上に配列を多用しているため、ちときつい.
おそらく、Java で 関数型を学ぶとすると、仕事で Java8 以降の開発に携わることができたときかな。今の職場じゃ絶望的…早くコイコイ関数型の時代.
Special Thanks
- Java Stream メモ(Hishidama’s Java8 Stream Memo)
- java.util.stream (Java Platform SE 8 )
- Java 8 の新機能をエレガントに使いたい | mono の開発ブログ
- Stream API にチャレンジ! - Java EE 事始め!
- java8 - コレクションを強化した Stream - Qiita
- Java SE 8 のストリーム API の正しい使い方──ラムダ式とともに導入された新 API で、並列処理の実装はどう変わるのか? - page2 - builder by ZDNet Japan
以上、Happy Hacking!!