【Java学習|豆知識】Java 11以降の必須スキル!String.lines()で改行コードをスマートに処理する方法

導入

開発現場でログファイルやテキストデータを扱う際、改行コード(\nや\r\n)で区切られた文字列を一行ずつ処理したい場面は非常に多いです。従来、split(“\\R”)などを使って分割していましたが、正規表現のオーバーヘッドや空文字の扱いに悩まされることもありました。Java 11から導入されたString.lines()は、これらを解決し、より直感的で効率的なストリーム処理を可能にする強力なメソッドです。

基礎知識

String.lines()は、文字列を改行コードに基づいて分割し、Streamとして返すメソッドです。最大の特徴は、システム依存の改行コード(CR, LF, CRLF)を自動的に判別し、適切に分割してくれる点です。また、splitメソッドと異なり、末尾の空行を無視する仕様ではなく、ストリームとして遅延評価的に処理できるため、巨大な文字列を扱う際のメモリ効率も優れています。

実装/解決策

String.lines()を使用することで、for文や複雑な正規表現を使わずに、Stream APIの豊富な機能(map, filter, collectなど)を直接活用できます。例えば、各行の空白を除去してリストに格納したり、特定のキーワードが含まれる行だけを抽出したりといった処理が、非常に簡潔に記述可能です。

サンプルプログラム

以下のコードは、複数行の文字列から空行を除去し、各行をトリミングしてリスト化する実用的な例です。

import java.util.List;
import java.util.stream.Collectors;

public class LinesExample {
    public static void main(String[] args) {
        String data = "  Javaエンジニアへ   \n\n  String.lines()は便利です  \n  ";

        // lines()でストリーム化し、加工してリストに変換
        List processedLines = data.lines()
            .map(String::trim)          // 各行の前後の空白を削除
            .filter(line -> !line.isEmpty()) // 空行を除外
            .collect(Collectors.toList()); // リストに収集

        // 結果の出力
        processedLines.forEach(System.out::println);
    }
}

応用・注意点

現場での活用において、以下の点に注意してください。

1. ストリームのクローズ
String.lines()が返すストリームは、基本的にリソースのクローズを必要としませんが、ファイルから読み込んだ文字列を処理する場合などは、メモリ消費量に注意してください。あまりに巨大な文字列を一度にメモリに載せるとOutOfMemoryErrorの原因となります。

2. 改行コードの保持
lines()は改行コードを除去して各行を返します。もし元の改行コードを保持したまま処理したい場合は、このメソッドは適していません。その場合は、BufferedReaderのreadLine()を使用するか、別の正規表現処理を検討してください。

3. レコードとの組み合わせ
Java 14以降で導入されたレコード(Records)と組み合わせると、データの変換処理がより強力になります。例えば、CSV形式の文字列をlines()で分割し、そのままレコードのコンストラクタへ渡すといった設計は、近年のモダンなJava開発において非常にクリーンな手法です。

まずはプロジェクトのJavaバージョンを確認し、もしJava 11以上であれば、古いsplit処理をlines()に置き換えることから始めてみてください。コードの可読性が格段に向上するはずです。

コメント

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