導入
開発現場でログファイルやテキストデータを扱う際、改行コード(\nや\r\n)で区切られた文字列を一行ずつ処理したい場面は非常に多いです。従来、split(“\\R”)などを使って分割していましたが、正規表現のオーバーヘッドや空文字の扱いに悩まされることもありました。Java 11から導入されたString.lines()は、これらを解決し、より直感的で効率的なストリーム処理を可能にする強力なメソッドです。
基礎知識
String.lines()は、文字列を改行コードに基づいて分割し、Stream
実装/解決策
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()に置き換えることから始めてみてください。コードの可読性が格段に向上するはずです。

コメント