SeouliteLab

[Java/자바] 다수의 Predicate를 and()로 연결하여 수행하기 본문

프로그래밍

[Java/자바] 다수의 Predicate를 and()로 연결하여 수행하기

Seoulite Lab 2024. 3. 13. 08:37

Java에서는 Predicate의 and() 메서드를 사용하여 다수의 Predicate를 연결하고, 모든 조건이 true일 때 true를 반환합니다. 이를 통해 여러 조건을 한꺼번에 검사할 수 있습니다.

1. Predicate.and() 메서드 소개

Predicate.and() 메서드는 Predicate 인터페이스의 디폴트 메서드로, 현재 Predicate와 다른 Predicate를 and 연산하여 새로운 Predicate를 생성합니다.

2. Predicate.and() 메서드 예제

예제 1: 숫자가 양수이면서 짝수인지 확인하기

import java.util.function.Predicate;

public class PositiveEvenNumberCheck {
    public static void main(String[] args) {
        Predicate<Integer> isPositive = num -> num > 0;
        Predicate<Integer> isEven = num -> num % 2 == 0;
        Predicate<Integer> isPositiveEven = isPositive.and(isEven);

        System.out.println(isPositiveEven.test(6)); // true 출력
        System.out.println(isPositiveEven.test(-2)); // false 출력
        System.out.println(isPositiveEven.test(3)); // false 출력
    }
}

위 예제에서는 숫자가 양수이면서 짝수인지 확인하는 Predicate를 만들기 위해 isPositive와 isEven 두 개의 Predicate를 and() 메서드로 연결합니다.

예제 2: 문자열이 특정 길이 이상이면서 소문자인지 확인하기

import java.util.function.Predicate;

public class StringLengthAndCaseCheck {
    public static void main(String[] args) {
        Predicate<String> isLongerThan5 = str -> str.length() > 5;
        Predicate<String> isLowerCase = str -> str.equals(str.toLowerCase());
        Predicate<String> isLongerThan5AndLowerCase = isLongerThan5.and(isLowerCase);

        System.out.println(isLongerThan5AndLowerCase.test("java8")); // true 출력
        System.out.println(isLongerThan5AndLowerCase.test("Python")); // false 출력
        System.out.println(isLongerThan5AndLowerCase.test("Java")); // false 출력
    }
}

위 예제에서는 문자열이 특정 길이 이상이면서 소문자인지 확인하는 Predicate를 만들기 위해 isLongerThan5와 isLowerCase 두 개의 Predicate를 and() 메서드로 연결합니다.

예제 3: 나이가 18세 이상이면서 성인인지 확인하기

import java.util.function.Predicate;

public class AdultCheck {
    public static void main(String[] args) {
        Predicate<Integer> isAdult = age -> age >= 18;
        Predicate<String> isAdultName = name -> name.startsWith("Mr.");
        Predicate<String> isAdultWithMr = isAdult.and(isAdultName);

        System.out.println(isAdultWithMr.test(25)); // false 출력
        System.out.println(isAdultWithMr.test(30)); // true 출력
    }
}

위 예제에서는 나이가 18세 이상이면서 성인 이름인지 확인하는 Predicate를 만들기 위해 isAdult와 isAdultName 두 개의 Predicate를 and() 메서드로 연결합니다.

예제 4: 파일이 존재하고 읽기 권한이 있는지 확인하기

import java.io.File;
import java.util.function.Predicate;

public class FilePermissionCheck {
    public static void main(String[] args) {
        Predicate<File> fileExists = File::exists;
        Predicate<File> canRead = File::canRead;
        Predicate<File> filePermission = fileExists.and(canRead);

        File file = new File("path/to/file.txt");
        System.out.println(filePermission.test(file)); // true 또는 false 출력
    }
}

위 예제에서는 파일이 존재하고 읽기 권한이 있는지 확인하는 Predicate를 만들기 위해 fileExists와 canRead 두 개의 Predicate를 and() 메서드로 연결합니다.

예제 5: 문자열이 특정 단어를 포함하고 특정 길이 이상인지 확인하기

import java.util.function.Predicate;

public class StringContainAndLengthCheck {
    public static void main(String[] args) {
        Predicate<String> containsJava = str -&

gt; str.contains("Java");
        Predicate<String> isLongerThan10 = str -> str.length() > 10;
        Predicate<String> containsJavaAndLongerThan10 = containsJava.and(isLongerThan10);

        System.out.println(containsJavaAndLongerThan10.test("Java Programming")); // true 출력
        System.out.println(containsJavaAndLongerThan10.test("Python Programming")); // false 출력
        System.out.println(containsJavaAndLongerThan10.test("Java")); // false 출력
    }
}

위 예제에서는 문자열이 특정 단어를 포함하고 특정 길이 이상인지 확인하는 Predicate를 만들기 위해 containsJava와 isLongerThan10 두 개의 Predicate를 and() 메서드로 연결합니다.

예제 6: 사용자가 관리자인지 확인하기

import java.util.function.Predicate;

public class AdminCheck {
    public static void main(String[] args) {
        Predicate<User> isAdmin = user -> user.getRole().equals("admin");
        Predicate<User> isActive = user -> user.isActive();
        Predicate<User> isAdminAndActive = isAdmin.and(isActive);

        User user1 = new User("John", "admin", true);
        User user2 = new User("Alice", "user", true);

        System.out.println(isAdminAndActive.test(user1)); // true 출력
        System.out.println(isAdminAndActive.test(user2)); // false 출력
    }

    static class User {
        private String name;
        private String role;
        private boolean active;

        public User(String name, String role, boolean active) {
            this.name = name;
            this.role = role;
            this.active = active;
        }

        public String getRole() {
            return role;
        }

        public boolean isActive() {
            return active;
        }
    }
}

위 예제에서는 사용자가 관리자이면서 활성화된 사용자인지 확인하는 Predicate를 만들기 위해 isAdmin와 isActive 두 개의 Predicate를 and() 메서드로 연결합니다.