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

public class ManfaatKomposisi {

    record Transaksi(String kategori, int jumlah) {}

    // Behavior (kriteria) disuntik sebagai parameter, bukan ditulis ulang
    static List<Transaksi> pilih(List<Transaksi> data, Predicate<Transaksi> kriteria) {
        List<Transaksi> hasil = new ArrayList<>();
        for (Transaksi t : data) {
            if (kriteria.test(t)) {
                hasil.add(t);
            }
        }
        return hasil;
    }

    public static void main(String[] args) {
        List<Transaksi> transaksi = List.of(
                new Transaksi("makan", 25000),
                new Transaksi("transportasi", 12000),
                new Transaksi("makan", 40000),
                new Transaksi("hiburan", 60000));

        Predicate<Transaksi> kategoriMakan = t -> t.kategori().equals("makan");
        Predicate<Transaksi> jumlahBesar = t -> t.jumlah() > 30000;

        System.out.println("Transaksi makan      : " + pilih(transaksi, kategoriMakan).size());
        System.out.println("Transaksi > 30 ribu  : " + pilih(transaksi, jumlahBesar).size());
        System.out.println("Makan DAN > 30 ribu  : " + pilih(transaksi, kategoriMakan.and(jumlahBesar)).size());
    }
}
