Java 逆引き集 | サードパーティライブラリ(jOOλ 等)の活用 — ストリーム拡張

Java Java
スポンサーリンク

ポイントまとめ

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λ の便利さが直感で理解できます。

タイトルとURLをコピーしました