Java函数式接口

举报
YuShiwen 发表于 2022/03/31 00:04:52 2022/03/31
【摘要】 一.初识函数式接口 只包含一个抽象方法的接口,称为函数式接口。你可以通过 Lambda 表达式来创建该接口的对象。若 Lambda 表达式抛出一个受检异常(即:非运行时异常),那么该异常需要在目标接口的...

一.初识函数式接口

  • 只包含一个抽象方法的接口,称为函数式接口。
  • 你可以通过 Lambda 表达式来创建该接口的对象。若 Lambda 表达式抛出一个受检异常(即:非运行时异常),那么该异常需要在目标接口的抽象方法上进行声明。
  • 我们可以在一个接口上使用 @FunctionalInterface 注解,这样做可以检查它是否是一个函数式接口。同时 javadoc 也会包含一条声明,说明这个接口是一个函数式接口。
  • 在java.util.function包下定义了Java 8 的丰富的函数式接口

二.Java内置四大核心函数式接口

函数式接口 参数类型 返回类型 用途
Consumer <T> 消费型接口 T void 对类型为T的对象应用操作,包含方法:void accept(T t)
Supplier <T> 供给型接口 T 返回类型为T的对象,包含方法:T get()
Function<T,R> 函数型接口 T R 对类型为T的对象应用操作,并返回结果。结 果是R类型的对象。包含方法:R apply(T t)
Predicate<T> 断定型接口 T boolean 确定类型为T的对象是否满足某约束,并返回 boolean 值。包含方法:boolean test(T t)

举例:
代码示例一:

    @Test
    public void test1(){
        //原始写法
        Consumer<Integer> consumer = new Consumer<>() {
            @Override
            public void accept(Integer i) {
                System.out.println("买物品需:" + i + "元");
            }
        };

        buySomething(999,consumer);

        //匿名实现类的匿名对象写法
        buySomething(555,new Consumer<Integer>(){

            @Override
            public void accept(Integer integer) {
                System.out.println("买球鞋需:" + integer + "元");
            }
        });

        //Lambda表达式写法
        buySomething(666,i -> System.out.println("买乳清蛋白粉需:" + i + "元"));
        
    }

    public void buySomething(int money, Consumer<Integer> consumer){
        consumer.accept(money);
    }


  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30

输出结果:

买物品需:999元
买球鞋需:555元
买乳清蛋白粉需:666元

Process finished with exit code 0


  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

代码示例二:

    @Test
    public void test2(){
        List<Integer> list = Arrays.asList(123,456,789,555,999,2,333,6,88,99,77,66,33,233,888,111);

        List<Integer> getList = meetTheConditions(list,i -> i <= 333);

        System.out.println(getList);
    }

    public List<Integer> meetTheConditions(List<Integer> list,Predicate<Integer> predicate){
        ArrayList<Integer> arrayList = new ArrayList<>();

        for (Integer i : list) {
            if(predicate.test(i)){
                arrayList.add(i);
            }
        }

        return arrayList;
    }


  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21

输出结果:

[123, 2, 333, 6, 88, 99, 77, 66, 33, 233, 111]

Process finished with exit code 0


  
 
  • 1
  • 2
  • 3
  • 4

三.其他接口

函数式接口 参数类型 返回类型 用途
BiFunction<T, U, R> T, U R 对类型为 T, U 参数应用操作,返回 R 类型的结 果。包含方法为: R apply(T t, U u);
UnaryOperator<T> (Function子接口) T T 对类型为T的对象进行一元运算,并返回T类型的 结果。包含方法为:T apply(T t);
BinaryOperator<T> (BiFunction 子接口) T, U void 对类型为T, U 参数应用操作。 包含方法为: void accept(T t, U u)
BiConsumer<T, U> T, U void 对类型为T, U 参数应用操作。 包含方法为: void accept(T t, U u)
BiPredicate<T,U> T,U boolean 包含方法为: boolean test(T t,U u)
ToIntFunction<T> ToLongFunction<T> ToDoubleFunction<T> T int long double 分别计算int、long、double值的函数
IntFunction<R> LongFunction<R> DoubleFunction<R> int long double R 参数分别为int、long、double 类型的函数

文章来源: blog.csdn.net,作者:Mr.Yushiwen,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/MrYushiwen/article/details/111146205

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。