函数式接口不会用?看这篇文章就够了
创始人
2024-03-28 10:22:28
0

一. 函数式接口简介

最近有粉丝给壹哥发来私信,说工作中要用到函数式接口,但是自己却不知道怎么用。既然如此,壹哥就给大家编写一个入门级别的函数式接口教程吧,希望可以让大家对函数式编程快速入门。

1. 什么是函数式接口?

如果在Java的接口中,有且只有一个抽象方法,那么这种接口就是函数式接口。函数式接口是使用Lambda表达式的前提条件。

2. 为什么要使用函数式接口?

在Java中不支持将函数作为一个数据,也就不能将函数作为方法的参数进行传递。因此给函数外加一层接口的声明,相当于为其穿上一件漂亮的外衣包装起来。如果需要将函数作为方法传递时,就可以传递函数所在接口的实现类对象,来间接的传递方法内容了。

3. 函数式接口定义

我们可以使用@FunctionalInterface注解来检查一个接口是否是一个函数式接口。放在接口定义的上方,如果接口是函数式接口,编译通过;如果不是,则编译失败。

二. 函数式接口案例

接下来壹哥就通过一些代码案例,来带大家学习函数式接口的使用。

1. 定义函数式接口

这里我们先定义一个带有一个方法的接口。

@FunctionalInterface
public interface MyFunctionInterface {void show();
}

2. 使用函数式接口

然后我们再编写一个测试类进行测试。

public class UserFunctionInterface {//定义一个方法以函数式接口作参数public static void test(MyFunctionInterface myfun){myfun.show();}//程序入口public static void main(String[] args) {//1.使用匿名内部类的方式MyFunctionInterface myfun = new MyFunctionInterface() {@Overridepublic void show() {System.out.println("使用匿名内部类的方式实现函数式接口....");}};test(myfun);//2.直接传递匿名内部类test(new MyFunctionInterface() {@Overridepublic void show() {System.out.println("使用直接传递匿名内部类的方式....");}});//3.使用Lambda表达式的方式使用函数式接口test(()-> System.out.println("使用Lambda表达式的方式使用函数式接口..."));}
}

三. 常用函数式接口

Java8中提供了一些常用的函数式接口,在使用类似功能的时候,不需要额外定义接口,直接使用jdk8中提供的即可。

1. 消费型接口

消费型接口的内部包含了一个void accept(T t)方法,是一个有参无返回值的方法,其消费数据的数据类型由泛型决定。我们可以定义一个方法,体现不同客户对X元现金的不同消费情况进行描述,即将消费金额和消费方式都以方法参数的形式进行传递。具体需求如下:

1). 客户1: 花了X元, 买了一盒化妆品;

2). 客户2 : 花了X元, 吃了一顿美食。

public class TestConsumer {//定义方法实现用户消费的功能public static void userConsumer(Double money,Consumer con){con.accept(money);
}//测试
public static void main(String[] args) {//客户1:花了X元, 买了一盒化妆品userConsumer(500.0,money -> System.out.println("客户1花了"+money+"买了一盒化妆品"));//客户2:花了X元, 吃了一顿美食userConsumer(800.0,money -> System.out.println("客户2花了"+money+"元钱吃了一顿美食"));}  
}

2. 供给型接口

供给型接口的内部包含了一个T get()方法,是一个无参有返回值的方法。根据用户指定的接口泛型类型,生产泛型类型的数据提供给我们。

我们再来定义一个方法,能给客户返回一个ArrayList类型的集合,集合中返回几个数据,以及数据有什么规律都由客户决定。具体需求如下:

1). 客户1 : 要5个1-10之间的随机数整数;

2). 客户2 : 要8个1-100之间的偶数。

public class TestSupplier {public static void main(String[] args) {//1.客户1 : 要5个1-10之间的随机数整数List list1 = useSupplier(5, new Supplier() {@Overridepublic Integer get() {return (int) (Math.random() * 10 + 1);}});System.out.println(list1);//2.客户2 : 要8个1-100之间的偶数List list2 = useSupplier(8, () -> {int num = (int) (Math.random() * 100 + 1);if (num % 2 == 0) {return num;} else {return num + 1;}});System.out.println(list2);}/** 根据客户需求,返回n个满足某个规律的数* */public static List useSupplier(int count, Supplier sup){List list = new ArrayList<>();for (int i = 0; i < count; i++) {Integer integer = sup.get();list.add(integer);}return list;}
}

3. 函数型接口

函数型接口的内部包含了一个R apply(T t)方法,是一个有参有返回值的方法。通常用于对参数进行处理,转换(处理逻辑由Lambda表达式实现),然后返回一个新的值。这里我们也可以定义一个方法,给定一个整数x,根据Lambda表达式的实现转换成对应的y,具体需求如下:

1). 客户1 : y为x的2倍;

2). 客户3 : y为x的平方。

public class TestFunction {public static void main(String[] args) {// 1)客户1 : y为x的2倍System.out.println(useFunction(5, x -> x * 2));// 10// 2) 客户2 : y为x的平方System.out.println(useFunction(-9, x -> x * x));// 81}/** 根据x计算y* 参数x代表用户传递的数* 参数2代表用户要求得到结果的实现方式* */public static int useFunction(int x, Function fun) {return fun.apply(x);}
}

4. 断言型接口

断言型接口的内部包含了一个boolean test(T t)方法,对给定的参数进行判断(判断逻辑由Lambda表达式实现),如果符合要求返回true,不符合则返回false。

这里也定义一个方法,需要用户提供一个容器ArrayList,根据用户的需求,将容器中符合条件的数据筛选出来,将筛选出的数据放置在新容器中返回给用户。具体需求如下:

1). 客户1: 要求返回集合中能被2整除的所有数;

2). 客户2: 要求返回不大于100所有的数据。

public class TestPredicate {public static void main(String[] args) {ArrayList list1 = new ArrayList<>();list1.add(12);list1.add(11);list1.add(120);list1.add(111);list1.add(67);list1.add(88);// 1)客户1 : 要求容器中的所有数, 都能被2整除System.out.println(usePredicate(list1,x->x%2==0));// [12, 120, 88]// 2)客户2 : 要求所有的数据都不大于100System.out.println(usePredicate(list1,x->x < 100));// [12, 11, 67, 88]}/** 对客户提交的数据进行过滤处理* */public static ArrayList usePredicate(ArrayList list1, Predicate pre){ArrayList list = new ArrayList<>();for(Integer i : list1){//过滤处理,符合条件的数据放到新集合中if(pre.test(i)){list.add(i);}}//返回新集合return list;}
}

现在你学会函数式接口了吗?如果你还有什么疑问,在评论区留言或私信吧。

相关内容

热门资讯

深证100ETF华安(1597... 4月2日,深证100ETF华安(159706)收盘跌0.85%,成交额61.42万元。深证100ET...
元鼎智能完成近10亿元融资 转自:中国证券报·中证网  中证报中证网讯(记者 黄一灵)全球无线泳池机器人公司元鼎智能近日完成新一...
淘宝童装摄影 这些图是怎么拍出... 淘宝童装摄影 这些图是怎么拍出来的呢 哪位师傅可以帮忙来看看吗 最好实地帮忙调光第一张我自己拍的不好...
税收数据折射经济亮点|创新动能... 税收数据是重要的经济数据,能直接反映经济运行情况。“增值税发票数据显示,今年1月1日至3月25日,我...
大海那边是什么 大海那边是什么是做 暑假作业吧!!!大海的 那边 是 太阳的家、是 美洲、是 月亮的家、是 夕阳 的...
“二”了半辈子被优化,穆勒终究... 来源:澎湃新闻 赛季尚未结束,“优化”大潮已提前来袭,哪怕为球队效力了16年的元勋,都无法幸免。近日...
介绍下战国时期的张仪,苏秦两人... 介绍下战国时期的张仪,苏秦两人的雄才大谋。以及鬼谷子所创的纵横家,尽量详细点!~还有一怒而天下惧,安...
斗罗大陆史莱克七怪打凶神战队赢... 斗罗大陆史莱克七怪打凶神战队赢了没有反正大赛他们是冠军,你说赢没有,,,小说版本
浙江女排前队长跨行卖儿童书桌年... 【#浙江女排前队长跨行卖儿童书桌年销超5亿元# 】浙江,宁波人白艳珍曾是浙江省排球队队长,退役后成为...
绵阳市刘文菊名校长工作室开展2...   3月27至28日,绵阳市刘文菊名校长工作室在安州永盛小学开展了以“探究推进区域均衡,深化三新课堂...
89岁院士苏定强,在南京捐出1... 转自:北京日报客户端3月31日,中国科学院南京天文光学技术研究所天文仪器与技术创新奖捐赠仪式上,中国...
恶魔少爷别吻我,李宏毅的声音,... 恶魔少爷别吻我,李宏毅的声音,是不是配音?是李宏毅自己的声音两部都是配音的,他自己在直播里面说了,本...
安迪苏跌0.94%,中期趋势方... 4月2日,安迪苏跌0.94%,成交额8074.41万元,换手率0.29%,总市值283.48亿元。根...
你点单 我讲课 安徽宣城市市场... 转自:中国质量报你点单 我讲课安徽宣城市市场监管局“你点我讲·质惠宣城”质量培训活动获好评□ 王本慧...
国家发展改革委:严禁将非信用信... 在国务院新闻办今天举行的新闻发布会上,国家发展改革委有关负责人表示,在社会信用体系建设工作中,要严格...
“肾虚”男子为购买保健品,疯狂... 转自:上观新闻蟊贼捡到他人医保卡后竟疯狂盗刷卡内余额,购买各类保健品保养自己的身体,最终难逃法网.....
山东省产品质量检验研究院推进“... 转自:中国质量报本报讯 (记者朱文达)为进一步加快国家市场监督管理总局技术创新中心(绿色包装评价)筹...
首创环保跌0.63%,成交额1... 4月2日,首创环保跌0.63%,成交额1.82亿元,换手率0.78%,总市值230.49亿元。根据A...
武汉创栾工贸有限公司召回部分黄... 中国质量新闻网讯 据湖北省市场监管局网站消息,日前,武汉创栾工贸有限公司按照《消费品召回管理暂行规定...
湖南:推出2025年青年就业创... 转自:人力资源和社会保障部  近日,湖南省就业促进和劳动保护工作领导小组印发《2025年湖南省青年就...