JAVA基础--函数式接口

函数式接口

定义:有且仅有一个抽象方法的接口,一般会有@FunctionalInterface注释。
例如:Runnable,Comparator,Supplier,Predicate,Function,Consumer。
在这里插入图片描述

1.Supplier接口

在这里插入图片描述

接口仅包含一个无参方法:T get(),用来获得一个泛型参数指定的对象类型。

public static Person ceratePerson(Supplier<Person> supplier){
    return supplier.get();
}
public static void main(String[] args) {
    String name = "张三";
    int age = 20;
    Person p = ceratePerson(() -> new Person(name,age));
    System.out.println(p);
}

在这里插入图片描述

可以得到一个Person对象

2.Consumer接口

在这里插入图片描述
接口包含一个抽象方法:void accept(T t),消费一个指定泛型的数据,还有一个默认方法:andThen(Consumer c),消费数据的时候可以先做一个操作,再做另一个操作。
accept(T t)

public static void consumeString(Consumer<Person> consumer, Person p){
    consumer.accept(p);
}
public static void main(String[] args) {
    consumeString((t) -> {
        System.out.println(t.getName() + "今年" + t.getAge() + "岁了!");
    },new Person("张三",18));
}

在这里插入图片描述

andThen(Consumer<> c)

 public static void print(Consumer<Person> p1,Consumer<Person> p2,Person p){
    p1.andThen(p2).accept(p);
    // 等价于执行一次p1.accept(p);和一次p2.accept(p);
}
public static void main(String[] args) {
    Person p = new Person("张三",18);
    print((t) -> {System.out.print(t.getName() + "有孩子了!");},
            (t) ->{System.out.println("孩子今年" + t.getAge() + "岁了!");},p);
}

在这里插入图片描述

3.Predicate接口

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
用来对数据类型进行判断,包含一个抽象方法boolean test(T t)和默认方法 Predicate and(Predicate),Predicate or(Predicate),Predicate negate()和静态方法Predicate isEqual(Object)。
test(T t)

public static void print(Predicate<Person> predicate,Person[] p){
    for (Person person:p) {
        if(predicate.test(person))
            System.out.println(person);
    }
}
public static void main(String[] args) {
    Person[] ps = {new Person("张三",18),
            new Person("吴某",30),
            new Person("胡歌",40),
            new Person("蔡徐坤",50),
            new Person("蔡帆帆",20),
            new Person("吴哥",25)};
    print(p -> p.getName().startsWith("蔡"),ps);
}

在这里插入图片描述
and(Predicate),or(Predicate),negate()用法相似,拿or举例

public static void print(Predicate<Person> predicate1, Predicate<Person> predicate2,Person[] ps){
    for (Person p:ps) {
        if(predicate1.or(predicate2).test(p))
            System.out.println(p.getName() + "哥哥会唱跳rap打篮球");
    }
}
public static void main(String[] args) {
    Person[] ps = {new Person("张三",18),
            new Person("胡歌",30),
            new Person("鸡",40),
            new Person("蔡徐坤",50),
            new Person("蔡帆帆",20),
            new Person("吴哥",25)};
    print(p -> p.getName().startsWith("蔡"),(p) -> {return p.getName().startsWith("鸡");},ps);
}

在这里插入图片描述

4.Function接口

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
可以根据一个类型数据得到另一个类型数据,包含一个抽象方法R apply(T t) 将T类型转换成R类型和两个默认方法Function compose(Function f)和Function andThen(Function f),还有一个静态方法Function identity()。
R apply(T t)

 public static Date transfer(Function<String , Date> function,String str){
    return function.apply(str);
}
public static void main(String[] args) {
    System.out.println(transfer((s) -> {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
        try {
            return sdf.parse(s);
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return null;
    },"2022-01-19 11:21:21"));
}

在这里插入图片描述
Function andThen(Function f)实现组合操作

public static Person transfr(Function<String, Date> function1,Function<Date,Person> function2,String str){
    return function1.andThen(function2).apply(str);
    //等价于 Date date = function1.apply(str);
    //return function2.apply(date);
}
public static void main(String[] args) {
    Person p = transfr((s) -> {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
        try {
            return sdf.parse(s);
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return null;}, (date) -> {
        return new Person("aaa",18);
    },"2022-01-19 11:21:21");
    System.out.println(p);
}

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值