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(), 컬렉션 순회 등 다양한 상황에서 정규 표현식 매칭 로직을 간결하고 가독성 있게 작성할 수 있습니다.