java学习——函数式接口

本文详细介绍了Java中的函数式接口概念,包括Supplier、Consumer、Predicate和Function接口的用法,并通过实例演示了如何使用Lambda表达式简化接口实现。重点展示了如何在Demo1、Demo2、Demo3和Demo4中运用这些接口及其Lambda形式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

函数式接口

概念:

函数式接口在Java中是指:有且仅有⼀个抽象方法的接口。

函数式接口注解 @FunctionalInterface - > JDK8

@xxx -> 注解 :给JVM看 参与编译 // /**/ -> 注释:给程序员看,不参与编译

⼀旦使用该注解来定义接口,编译器将会强制检查该接口是否确实有且仅有⼀个抽象方法,否则将会报错。需要注意的是,即使不使用该注解,只要满足函数式接口的定义,这仍然是⼀个函数式接口,使用起来都⼀样。

4个常用的函数式接口:

  1. Supplier : 生产者 -> T get():生产对象
  2. Consumer :消费者 -> void accept(T t)
  3. Predicate:判断 -> boolean test(T t):判断t对象,判断逻辑自定义
  4. Function<T, R> function1: 类型转换
    R apply(T t): 将t对象 转换成 R 类型
    Function andThen(Function<R, V> after):
    function1.andThen(Function<R, V> after).apply(T t)
    R r = function1.apply(T t);
    V v = after.apply(R r);

Supplier实现:

主函数:
public class Demo1 {
    //为了使用Lambda表达式,定义了一个方法,将Supplier作为方法参数
    //Supplier是一个函数式接口
    public static Person creatPerson(Supplier<Person> supplier) {
        return supplier.get();
    }

    public static void main(String[] args) {
        String name = "lucy";
        int age = 18;
        //传统方法实现
        Person p1 = creatPerson(new Supplier<Person>() {
            @Override
            public Person get() {
                return new Person(name, age);
            }
        });
        System.out.println(p1);

        //参数是一个函数是接口,所以可以使用lambda表达式
        //Supplier的方法是 T get()   T -> Person
        //lambda表达式简化后实现
        Person p2 = creatPerson(() -> new Person(name, age));
        System.out.println(p2);
    }
}
Person类:
public class Person {
    private String name;
    private int age ;

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }

    public Person() {
    }

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}
Person{name='lucy', age=18}
Person{name='lucy', age=18}

Consumer实现:

实现1:
public class Demo2Consumer {
    //Consumer是一个函数式接口
    public static void print(Consumer<Person> consumer, Person p) {
        consumer.accept(p);
    }

    public static void main(String[] args) {
        String name = "lucy";
        int age = 18;
        Person p = new Person(name, age);
        //传统方法实现
        print(new Consumer<Person>() {
            @Override
            public void accept(Person p) {
                System.out.println(p.getName() + "今年" + p.getAge() + "岁");
            }
        }, p);
        //lambda表达式简化后实现
        print((t -> System.out.println(t.getName() + "今年" + t.getAge() + "岁!")),p);
    }
}
lucy今年18岁
lucy今年18岁!
实现2:
public class Demo2ConsumerAndthen {
    //Consumer是一个函数式接口
    public static void print(Consumer<Person> consumer1, Consumer<Person> consumer2, Person p) {
        consumer1.andThen(consumer2).accept(p);
    }

    public static void main(String[] args) {
        String name = "lucy";
        int age = 18;
        Person p = new Person(name, age);
        //传统方法实现
        print(new Consumer<Person>() {
            @Override
            public void accept(Person p) {
                System.out.print("她的名字叫" + p.getName());
            }
        }, new Consumer<Person>() {
            @Override
            public void accept(Person person) {
                System.out.println("今年" + p.getAge() + "岁了");
            }
        }, p);
        //lambda表达式简化后实现
        print(t -> System.out.print("她的名字叫" + t.getName()),
                t -> System.out.println("今年" + p.getAge() + "岁了!!"), p
        );
    }
}
她的名字叫lucy今年18岁了
她的名字叫lucy今年18岁了!!

Predicate实现:

实现1:
public class Demo3Predicate {
    public static void print(Predicate<Person> predicate, Person[] ps) {
        for (Person p : ps) {
            if (predicate.test(p)) {
                System.out.println(p);
            }
        }
    }
    public static void main(String[] args) {
        Person[] ps = {new Person("张三", 15),
                new Person("张翰", 30),
                new Person("王五", 18),
                new Person("张无忌", 60),
                new Person("王五", 56)
        };
        //传统写法:
        //打印姓张的人
        print(new Predicate<Person>() {
            @Override
            public boolean test(Person p) {
                return p.getName().startsWith("张");
            }
        }, ps);
        System.out.println("----------------");
        //简化写法
        print(t->t.getName().startsWith("张"),ps);
    }
}
Person{name='张三', age=15}
Person{name='张翰', age=30}
Person{name='张无忌', age=60}
----------------
Person{name='张三', age=15}
Person{name='张翰', age=30}
Person{name='张无忌', age=60}
实现2:
public class Demo3PredicateAnd {
    public static void print(Predicate<Person> predicate1, Predicate<Person> predicate2, Person[] ps) {
        for (Person p : ps) {
            if (predicate1.and(predicate2).test(p)) {
                System.out.println(p);
            }
        }
    }

    public static void main(String[] args) {
        Person[] ps = {new Person("张三", 15),
                new Person("张翰", 30),
                new Person("王五", 18),
                new Person("张无忌", 60),
                new Person("王五", 56)
        };
        //传统写法:
        //打印姓张的人,且年龄小于50岁
        print(new Predicate<Person>() {
            @Override
            public boolean test(Person person) {
                return person.getName().startsWith("张");
            }
        }, new Predicate<Person>() {
            @Override
            public boolean test(Person person) {
                return person.getAge() < 50;
            }
        }, ps);
        System.out.println("----------------");
        //简化写法
        print(t -> t.getName().startsWith("张"),
                t -> t.getAge() < 50, ps);
    }
}
Person{name='张三', age=15}
Person{name='张翰', age=30}
----------------------------
Person{name='张三', age=15}
Person{name='张翰', age=30}

Function实现:

主函数:
public class Demo4Transfer {
    public static Date transfer(Function<String, Date> function, String str) {
        return function.apply(str);
    }

    public static void main(String[] args) {
        String str1 = "2022-07-19 11:48:19";
        //传统写法
        Date date = transfer(new Function<String, Date>() {
            @Override
            public Date apply(String s) {
                SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
                try {
                    return sdf.parse(str1);
                } catch (ParseException e) {
                    e.printStackTrace();
                }
                return null;
            }
        }, str1);
        System.out.println(date);
        String str2 = "2022-07-19 11:49:27";
        //简化写法
        Date date1 = transfer((t) -> {
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            try {
                return sdf.parse(t);
            } catch (ParseException e) {
                e.printStackTrace();
            }
            return null;
        }, str2);
        System.out.println(date1);
    }
}
Tue Jul 19 11:48:19 CST 2022
Tue Jul 19 11:49:27 CST 2022
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值