import java.util.ArrayList;
import java.util.List;
import java.util.function.BiPredicate;
import java.util.function.Predicate;

public class SaringPelamar {

    // Filter manual: syarat datang sebagai Predicate, loop tetap eksplisit
    static List<String> saring(List<String> data, Predicate<String> syarat) {
        List<String> hasil = new ArrayList<>();
        for (String item : data) {
            if (syarat.test(item)) {
                hasil.add(item);
            }
        }
        return hasil;
    }

    public static void main(String[] args) {
        List<String> pelamar = List.of("Budi", "Siti", "Dewi", "Ani", "Rahmat");

        Predicate<String> panjangMinimal = nama -> nama.length() >= 4;
        Predicate<String> diawaliHurufD = nama -> nama.startsWith("D");

        System.out.println("Panjang >= 4    : " + saring(pelamar, panjangMinimal));
        System.out.println("Diawali huruf D : " + saring(pelamar, diawaliHurufD));
        System.out.println("and             : " + saring(pelamar, panjangMinimal.and(diawaliHurufD)));
        System.out.println("or              : " + saring(pelamar, panjangMinimal.or(diawaliHurufD)));
        System.out.println("negate          : " + saring(pelamar, diawaliHurufD.negate()));

        // BiPredicate: dua nilai masuk, keputusan keluar
        BiPredicate<String, Integer> panjangTepat = (nama, n) -> nama.length() == n;
        System.out.println("Dewi 4 huruf?   : " + panjangTepat.test("Dewi", 4));
    }
}
