Computer >> 컴퓨터 >  >> 프로그래밍 >> Java

Java Pattern splitAsStream() 메서드 완벽 가이드와 실전 예제

java.util.regex 패키지의 Pattern 클래스는 정규 표현식(regular expression)을 컴파일한 결과를 표현하는 클래스입니다. 한 번 컴파일된 패턴은 재사용할 수 있어 반복적인 문자열 처리 작업에서 뛰어난 성능을 발휘합니다.

이 클래스가 제공하는 splitAsStream() 메서드는 입력 문자열을 나타내는 CharSequence 객체를 매개변수로 받습니다. 그리고 정규 표현식과 일치하는 지점을 만날 때마다 문자열을 새로운 부분 문자열로 분할한 뒤, 분할된 모든 부분 문자열을 담고 있는 Stream<String> 객체로 반환합니다.

splitAsStream() 메서드의 특징

split() 메서드가 배열을 반환하는 것과 달리, splitAsStream()은 스트림을 반환하기 때문에 Java 8의 Stream API에서 제공하는 filter(), map(), forEach() 같은 다양한 연산과 자연스럽게 연계하여 사용할 수 있습니다. 대용량 텍스트를 지연 평가(lazy evaluation) 방식으로 처리해야 할 때 특히 유용합니다.

예제 코드

다음 예제는 공백으로 둘러싸인 숫자를 기준으로 문자열을 분할하고, 그 결과를 스트림으로 출력합니다.

import java.util.regex.Pattern;
import java.util.stream.Stream;

public class SplitAsStreamMethodExample {
    public static void main(String args[]) {
        // 공백 사이에 있는 숫자를 찾기 위한 정규 표현식
        String regex = "(\\s)(\\d)(\\s)";
        String input = " 1 Name:Radha, age:25 2 Name:Ramu, age:32"
                + " 3 Name:Rajeev, age:45 4 Name:Raghu, age:35"
                + " 5 Name:Rahman, age:30";

        // 정규 표현식 컴파일
        Pattern pattern = Pattern.compile(regex);

        // 일치 여부 확인
        if (pattern.matcher(input).find())
            System.out.println("주어진 문자열에 숫자가 포함되어 있습니다.");
        else
            System.out.println("주어진 문자열에 숫자가 포함되어 있지 않습니다.");

        // 문자열을 스트림으로 분할
        Stream<String> stream = pattern.splitAsStream(input);
        Object obj[] = stream.toArray();
        for (int i = 0; i < obj.length; i++) {
            System.out.println(obj[i]);
        }
    }
}

실행 결과

주어진 문자열에 숫자가 포함되어 있습니다.
Name:Radha, age:25
Name:Ramu, age:32
Name:Rajeev, age:45
Name:Raghu, age:35
Name:Rahman, age:30

코드 설명

정규 표현식 (\s)(\d)(\s)는 '공백 + 숫자 한 자리 + 공백' 형태의 패턴을 의미합니다. 입력 문자열에는 각 사람 정보 앞에 번호(1~5)가 공백과 함께 위치하므로, 이 패턴이 일치하는 지점을 경계로 문자열이 분할됩니다.

분할 결과에서 각 항목의 맨 앞 번호와 공백이 제거되고 Name:이름, age:나이 형태의 정보만 남는 것을 확인할 수 있습니다. 반환된 스트림은 toArray()로 배열로 변환한 후 반복문으로 출력했지만, 필요에 따라 stream.forEach(System.out::println)처럼 스트림 연산을 직접 활용하는 방식으로도 처리할 수 있습니다.