ポイントまとめ
Java 標準の Stream API は便利ですが、制約もあります。サードパーティライブラリ jOOλ(jOOL) を使うと、タプル型や拡張関数、例外処理の簡略化などが可能になり、Stream の表現力が大幅に広がります。
jOOλ(jOOL)とは?
- 開発元: jOOQ シリーズの一部として提供される拡張ライブラリ。
- 特徴:
- Seq: Stream を拡張した型。便利メソッドが多数。
- Tuple: Java 標準にはないタプル型を提供(Tuple1〜Tuple16)。
- Unchecked: Stream 内での checked 例外を簡単にラップ。
- Function 拡張: 1〜16 引数までの関数型インターフェースを提供。
jOOλ は jOOQ と独立して単体利用可能。発音は「ジュール(jewel)」。
基本コード例
1) Seq の利用(標準 Stream より便利)
import org.jooq.lambda.Seq;
public class SeqExample {
public static void main(String[] args) {
Seq.of("a","b","c")
.zipWithIndex() // 要素にインデックスを付与
.forEach(t -> System.out.println(t.v1 + "@" + t.v2));
}
}
// 出力: a@0, b@1, c@2
Java- ポイント: 標準 Stream ではインデックス付与が面倒だが、Seq なら一発。
2) Tuple の活用
import org.jooq.lambda.tuple.Tuple2;
Tuple2<String,Integer> pair = new Tuple2<>("apple", 3);
System.out.println(pair.v1 + " x " + pair.v2); // apple x 3
Java- ポイント: 一時的な複数値保持に便利。Map.Entry より柔軟。
3) 例外処理の簡略化(Unchecked)
import org.jooq.lambda.Unchecked;
import java.nio.file.*;
Seq.of("a.txt","b.txt")
.map(Unchecked.function(Files::readString)) // IOException を自動ラップ
.forEach(System.out::println);
Java- ポイント: 標準 Stream では try-catch が必要だが、Unchecked で簡潔に。
例題で理解する
例題1: CSV の行をパースしてタプル化
List<String> rows = List.of("Tanaka,20","Sato,25");
Seq.seq(rows)
.map(r -> r.split(","))
.map(a -> new org.jooq.lambda.tuple.Tuple2<>(a[0], Integer.parseInt(a[1])))
.forEach(t -> System.out.println(t.v1 + " -> " + t.v2));
Java- 用途: 名前と年齢をタプルで保持。後段処理が読みやすい。
例題2: 複数リストの zip
List<String> names = List.of("A","B","C");
List<Integer> scores = List.of(80,90,70);
Seq.seq(names).zip(scores)
.forEach(t -> System.out.println(t.v1 + ":" + t.v2));
Java- 用途: 2つのリストを結合してペアにする。標準 Stream では冗長。
例題3: 例外を伴う処理を簡潔に
Seq.of("file1.txt","file2.txt")
.map(Unchecked.function(Files::readString))
.forEach(System.out::println);
Java- 用途: ファイル読み込みをワンライナーで。IOException を気にせず書ける。
テンプレート集
- Seq.of → zipWithIndex
Seq.of(list).zipWithIndex().forEach(t -> use(t.v1, t.v2));
Java- Tuple2 の生成
Tuple2<K,V> pair = new Tuple2<>(key, value);
Java- 例外処理簡略化
Seq.of(items).map(Unchecked.function(this::ioOp)).toList();
Java- 複数リストの zip
Seq.seq(list1).zip(list2).forEach(t -> use(t.v1, t.v2));
Java落とし穴と注意点
- 依存追加が必要: Maven/Gradle に jOOλ を追加する必要あり。
- 学習コスト: 標準 Stream にない API が多いので、チーム共有必須。
- Optional との違い: jOOλ の Tuple は null を許容するため、Optional と使い分ける。
- 過度な依存: 小規模プロジェクトでは標準 Stream で十分。大規模・複雑処理で活用価値が高い。
まとめ
- jOOλ は Stream を拡張する強力なライブラリ。Seq, Tuple, Unchecked などでコードが簡潔になる。
- 初心者は「zip」「Tuple」「例外処理簡略化」から試すと理解しやすい。
- 標準 API で冗長な処理を jOOλ で短く書けるのが最大のメリット。
👉 練習課題: 「2つのリスト(名前と点数)を zip で結合し、Tuple2 にして平均点を計算」してみましょう。jOOλ の便利さが直感で理解できます。
