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

Java Pattern asPredicate() 메서드 완벽 가이드 – 예제 코드로 쉽게 배우기

java.util.function 패키지의 Predicate 인터페이스는 람다 표현식(lambda expression)의 대상으로 활용할 수 있습니다. 이 인터페이스가 제공하는 test() 메서드는 전달받은 값을 현재 Predicate 객체의 조건과 비교하여 검증하며, 조건에 일치하면 true, 그렇지 않으면 false를 반환합니다.

java.util.regex.Pattern 클래스의 asPredicate() 메서드는 현재 Pattern 객체가 컴파일될 때 사용된 정규 표현식과 문자열을 비교·매칭할 수 있는 Predicate<String> 객체를 반환합니다. 즉, 정규 표현식을 함수형 인터페이스 기반의 조건 판별 로직으로 손쉽게 변환할 수 있습니다.

asPredicate() 메서드의 주요 특징

  • 컴파일된 정규 표현식을 Predicate 객체로 변환합니다.
  • 스트림(Stream) API나 컬렉션의 필터링 작업과 함께 사용하기에 적합합니다.
  • test() 메서드를 통해 문자열이 정규 표현식과 일치하는지 간단히 확인할 수 있습니다.

예제 1: 입력 문자열에서 특정 문자 찾기

import java.util.Scanner;
import java.util.function.Predicate;
import java.util.regex.Pattern;

public class AsPredicateExample {
    public static void main(String args[]) {
        // 사용자로부터 문자열 입력 받기
        Scanner sc = new Scanner(System.in);
        System.out.println("Enter input string");
        String input = sc.nextLine();

        // 문자 't'를 찾는 정규 표현식
        String regex = "[t]";

        // 정규 표현식 컴파일 (대소문자 구분 없음)
        Pattern pattern = Pattern.compile(regex, Pattern.CASE_INSENSITIVE);

        // 정규 표현식을 Predicate 객체로 변환
        Predicate<String> predicate = pattern.asPredicate();

        // 입력 문자열로 Predicate 테스트
        boolean result = predicate.test(input);

        if (result) {
            System.out.println("Match found");
        } else {
            System.out.print("Match not found");
        }
    }
}

실행 결과

Enter input string
Tutorialspoint
Match found

위 예제에서는 대소문자를 구분하지 않도록 Pattern.CASE_INSENSITIVE 플래그를 사용했기 때문에, 입력 문자열에 't' 또는 'T'가 포함되어 있으면 "Match found"가 출력됩니다.

예제 2: 리스트 요소 필터링하기

import java.util.ArrayList;
import java.util.Arrays;
import java.util.function.Predicate;
import java.util.regex.Pattern;

public class AsPredicateExample {
    public static void main(String args[]) {
        ArrayList<String> list = new ArrayList<String>();
        list.addAll(Arrays.asList("Java", "JavaFX", "Hbase", "JavaScript"));

        // 문자 'J'를 찾는 정규 표현식
        String regex = "[J]";

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

        // 정규 표현식을 Predicate 객체로 변환
        Predicate<String> predicate = pattern.asPredicate();

        // 리스트의 각 요소를 Predicate로 검사
        list.forEach(n -> {
            if (predicate.test(n)) {
                System.out.println("Match found " + n);
            }
        });
    }
}

실행 결과

Match found Java
Match found JavaFX
Match found JavaScript

두 번째 예제에서는 forEach()와 람다 표현식을 함께 사용하여 리스트의 각 요소가 정규 표현식 조건을 만족하는지 확인했습니다. 그 결과 'J'를 포함한 "Java", "JavaFX", "JavaScript" 세 개의 문자열만 출력되었습니다.

정리

Pattern.asPredicate() 메서드는 정규 표현식 기반의 문자열 검증 로직을 Predicate 함수형 인터페이스로 변환해 줍니다. 이를 활용하면 스트림의 filter(), 컬렉션 순회 등 다양한 상황에서 정규 표현식 매칭 로직을 간결하고 가독성 있게 작성할 수 있습니다.