@FunctionalInterface
interface PemberiDiskon {
    double hitung(double harga);

    // method default dan static tidak membatalkan status SAM
    default double setelahPajak(double harga) {
        return hitung(harga) * 1.11;
    }

    static PemberiDiskon tetap(double persen) {
        return harga -> harga * (1 - persen / 100);
    }
}

public class DiskonToko {
    public static void main(String[] args) {
        PemberiDiskon diskonAnggota = harga -> harga * 0.9;
        PemberiDiskon diskonAkhirTahun = harga -> harga - 20000;

        System.out.printf("Anggota        : %.2f%n", diskonAnggota.hitung(150000));
        System.out.printf("Akhir tahun    : %.2f%n", diskonAkhirTahun.hitung(150000));
        System.out.printf("Anggota+pajak  : %.2f%n", diskonAnggota.setelahPajak(150000));
        System.out.printf("Dari factory   : %.2f%n", PemberiDiskon.tetap(25).hitung(80000));
    }
}
