java中函数式接口的使用
java中函数式接口的使用
一、自己创建的函数式接口
1.1 概念
只存在一个抽象方法的接口。
1.2 使用步骤:
1、创建函数式接口,创建格式参照使用格式。
2、创建一个实例类
3、在实例类中使用函数式接口。
1.3 使用格式:
创建函数式接口的格式:
@FunctionalInterface // 注解,用于检测接口是否为函数式接口,是编译成功、否编译失败
public Interface 接口名称{
public abstract 数据类型(例如:void int boolean) 方法名称();
其他非抽象方法,即默认、静态、私有方法(可以省略)
}
1.4 示例:
@FunctionalInterfacepublic interface MyFunctionInterface {public abstract void method();}
1.5 注意事项:
1、只有一个抽象方法的接口才能称为函数式接口。
2、函数式接口中能存在非抽象方法(即默认、静态、私有方法),非抽象方法根据自己的需要进行编写。
3、函数式接口中实例类中一般作为方法的参数或者返回值使用,或者创建一个接口实现类然后在实例类中调用实现类使用。
二、Supplier接口
2.1 功能
返回泛型参数指定数据类型数据的接口,用于生产数据。
2.2 作为方法参数时的使用步骤
1、在类中创建一个方法,参数为Supplier接口。
2、在主方法中调用该方法,可以传递Supplier接口实现类、Supplier接口加重写方法、Lambda表达式的方式写实现方法。
2.3 注意事项
1、Supplier接口无参数,有返回值
2、Supplier接口返回数据的数据类型根据泛型传递的数据类型决定。
2.4 使用格式
2.4.1、创建方法,参数为Supplier接口
public static 数据类型 方法名(Supplier<数据类型> 参数名){
return 参数名.get();
}
2.4.2、调用方法
使用Supplier接口实现类:
数据类型 变量名 = 方法名称(new Supplier接口实现类);
使用匿名内部类:
数据类型 变量名 = 方法名称(new Supplier<数据类型>(){
@Override
public 数据类型 get(){
处理代码
return 指定数据类型的数据
}
});
使用Lambda表达式:
数据类型 变量名 = 方法名称(()->{
处理代码
return 指定数据类型的数据
});
2.5 示例
使用匿名内部类:
String s3 = getSupplier(new Supplier<String>() {@Overridepublic String get() {return "可莉";}});Lambda表达式:
String s1 = getSupplier(()->{return 1+"";});
三、Consumer接口
3.1 功能
用于对传递进来的数据进行处理的接口,用于消费数据。
3.2 作为方法参数时的使用步骤
1、创建一个方法,参数为需要处理的数据和Consumer接口。
2、在主方法中调用创建的方法,方法中传递需要处理的数据
3.3 注意事项
1、Consumer接口是有参数无返回值。
2、Consumer接口参数数据类型为泛型传递的数据类型。
3.4 使用格式
创建使用Consumer接口的方法:
修饰符(例如:public、private) static(在存在主函数的类中使用是存在) void 方法名(数据类型 变量名1, Consumer<数据类型> 变量名2){
变量名2.accept(变量名1);
}
调用方法:
1、使用Consumer接口实现类:
方法名(变量1, new Consumer接口实现类);
2、使用匿名内部类:
方法名(变量1, new Consumer接口<数据类型>(){
数据处理代码
});
3、使用Lambda表达式:
方法名(变量1,(变量名) -> {
数据处理代码
});
3.5 示例
创建方法:
public static void reverse(String str, Consumer<String> consumer){consumer.accept(str);
}
使用匿名内部类
reverse(str1, new Consumer<String>() {@Overridepublic void accept(String s) {String str = new StringBuffer(s).reverse().toString();System.out.println(str);}
});
使用Lambda表达式
reverse(str1, (s)->{String str = new StringBuffer(s).reverse().toString();System.out.println(str);
});
3.6 andThen方法
功能:当需要使用多个Consumer接口时,将多个Consumer接口组合到一起使用对数据进行处理。
使用格式:
以两个Consumer接口为例:Consumer接口变量名1.andThen(Consumer接口变量名2).accept(需要处理的数据)
示例:
public static void useAndThen(String s, Consumer con1, Consumer con2){
con1.andThen(con2).accept(s);
}
注意事项:
1、Consumer接口谁在前面谁先执行。
2、最后必须接accept方法才能处理数据。
四、Predicate接口
4.1 功能
用于对数据进行判断的接口。
4.2 作为方法参数时的使用步骤
1、创建一个方法,方法中传递需要进行判断的数据和Predicate接口,Predicate接口泛型需要与进行判断的数据的数据类型相同。
2、返回predicate接口变量的test方法,test方法中传递需要进行判断的数据。
3、在调用处创建方法,方法中传递需要判断的数据和Predicate接口实例。
4.3 注意事项
1、Predicate接口的test方法会返回一个boolean类型的值作为结果。
2、调用方法时需要将Predicate接口实例化。
4.4 使用格式
创建使用Predicate接口的方法
修饰符(例如:public、private) static(根据实际情况确定是否省略) boolean 方法名(需要判断的数据, Predicate<数据类型> 变量名){
return 变量名.test(需要判断的数据)
}
调用方法
1、使用Predicate接口实现类
方法名(需要判断的数据, new Predicate接口实例类);
2、使用匿名内部类
方法名(需要判断的数据, new Predicate<数据类型>(){
@Override
public boolean test(数据类型 变量名) {
数据判断代码
return 判断的结果;
}
});
3、使用Lambda表达式
方法名(需要判断是数据, (变量名) -> {
数据判断代码
return 判断的结果
})
4.5 示例
方法的创建public static boolean usePredicate(String s, Predicate<String> pre){return pre.test(s);}
方法的调用使用匿名内部类方式boolean b1 =usePredicate(str1, new Predicate<String>() {@Overridepublic boolean test(String s) {return s.length() > 6;}});使用Lambda表达式boolean b2 = usePredicate(str1, (t) -> {return t.length() > 6;});
4.6 and方法
功能:用于将多个Predicate接口判断的结果连接,当Predicate接口判断结果全为true时返回true,否则返回false。
使用格式:Predicate接口变量名1.and(Predicate接口变量名2).test(需要判断的数据)
示例:pre1.and(pre2).test(s);
4.7 or方法
功能:用于将多个Predicate接口判断的结果连接,当Predicate接口判断结果全为false时返回false,否则返回true。
使用格式:Predicate接口变量名1.or(Predicate接口变量名2).test(需要判断的数据)
示例:pre1.or(pre2).test(s);
4.8 !号
功能:用于将Predicate接口判断的结果取反,当Predicate接口判断结果为false时返回true,为true时返回false。
使用格式:!Predicate接口变量名1.test(需要判断的数据)
示例:!pre1.test(s);
5、Function接口
5.1 功能
数据处理后进行数据类型转换的接口。
5.2 作为方法参数时的使用步骤
1、创建方法,参数为需要转换的数据和Function接口。
2、在方法中调用Function接口的apply方法用于数据类型转换。
3、调用方法,在方法中传递需要转换的数据和Function接口功能实现代码。
5.3 注意事项
1、apply方法有返回值,返回值数据类型为转换后数据的数据类型。
2、调用方法时需要将Function接口实例化。
5.4 使用格式
创建方法格式:
修饰符(即public、private) static(根据情况决定是否数量) 返回值数据类型(如不想有数据返回使用void)
方法名(需要处理的数据, Function<转换前数据类型,转换后数据类型> 变量名1){
转换后数据类型 变量名 = 变量名1.apply(需要转换的数据);
}
使用方法格式:
1、使用Function接口实现类的方式
方法名(需要转换的数据,new Function接口实现类());
2、使用匿名内部类的方式
方法名(需要转换的数据,new Function<转换前数据类型, 转换后数据类型>(){
@Override
public 转换后的数据类型 apply(转换前的数据类型 变量名) {
数据处理代码
return 转换后的数据;
}
});
3、使用Lambda表达式的方式
方式名(需要转换的数据,(变量名) ->{
数据处理代码
return 转换后的数据;
})
5.5 使用示例
创建方法示例:public static void function1(String s, Function<String, Integer> fun){int n = fun.apply(s);System.out.println(n);}
调用方法示例:function1(str, new Function<String, Integer>() {@Overridepublic Integer apply(String s) {return Integer.parseInt(s);}});
5.6 andThen()方法
功能:连接两个Function接口的方法。
格式:Function接口变量名1.andThen(Function接口变量名2).apply(需要转换的数据)。
示例:fun1.andThen(fun2).apply(s);
java中函数式接口的使用相关推荐
- 学习 Java 8 - 函数式接口 Lambda
学习 Java 8 - 函数式接口 Java 8 引入了函数式接口的概念.函数式接口其实就是只包含一个抽象方法的普通 Java 接口.在没有引入函数式接口之前,我们通常使用内部类和匿名类来实现类似的功 ...
- 高级JAVA - 利用函数式接口实现通用的取并集/交集/差集进阶版
在前文(高级JAVA - 利用函数式接口实现通用的取并集/交集/差集)中我们实现了利用函数式接口获取交集/差集 , 但是只能全部生成 , 假如我们只需要一个交集的话 , 所有代码仍然会执行一次 . 比 ...
- java 常用 函数式接口_「java8系列」神奇的函数式接口
前言 在上一篇Lambda的讲解中我们就提到过函数式接口,比如:Consumer consumer = (s) -> System.out.println(s);其中Consumer就是一个函数 ...
- Java之函数式接口(FunctionalInterface)
Java之函数式接口(FunctionalInterface) 1. FunctionalInterface是什么? FunctionalInterface 中文称之为 函数式接口.是Java新特性之 ...
- Java中实现接口与继承的区别
** Java中实现接口与继承的区别 ** 首先,先来了解一下什么是接口和继承.接口一般是使用interface来定义的.接口定义同类的定义类似,分为接口的声明和接口体,其中接口体由常量定义和方法定义 ...
- Objective-C 入门(七)协议 protocol(JAVA中的接口)
Objective-C 入门(七)协议 protocol(JAVA中的接口) 接口的作用想必大家都比较了解 OV中的 protocol 相比接口作用相似 语法稍有不同 1.先来看声明一个协议 在创建文 ...
- Java中的接口命名[关闭]
本文翻译自:Interface naming in Java [closed] Most OO languages prefix their interface names with a capita ...
- java中接口什么时候用_我什么时候应该在java中使用接口?
在Java中精确使用接口的一个很好的例子将是理想的,适用于任何特定的规则. 看看丹以前所有的问题,他似乎只是逐字逐句地张贴家庭作业/考试问题. 令人惊讶的是,这些不是考试题或其他-今天才找到这个网站, ...
- Java 中 Comparable 接口的意义和用法.
在之前的博文中已经介绍了Java中Collection 接口和 Collections类. http://blog.csdn.net/nvd11/article/details/21516075 一, ...
最新文章
- 如何设计应用层协议(草稿)
- 一种去中心化的manager设计思路
- 有源晶振和无源晶振的输出波形
- Python Django安装MySQL库
- win10系统使用MarkdownPad2无法渲染
- 笔记本屏幕出现横条纹_笔记本支架+拓展坞+立式无线充:给你的桌面一个简单的品质升级...
- Android程序杀死自己的进程和其他程序进程方法
- java目录实用工具_JAVA 创建文件和文件夹,删除文件和文件夹的实用工具
- 怎么样成为一个高手--有悟
- 读写SQL数据库Image字段
- 页面中超长字段只显示部分
- 使用内存映射提高BufferedRandoAccessFile性能(测试可用)
- 定时自动关机计划命令
- kindle看pdf不清楚_不要再纠结pdf在kindle上的显示问题了,简单教程,拿去!不要太谢我。...
- 爬虫 Scrapy 学习:Spiders
- 结构光三维重建(二)线结构光三维重建
- 端午节(文章来源于网络)
- 【暮色天】行情反复 愈挫愈勇(1.15)
- 推荐一款 Redis 可视化管理工具——Another Redis Desktop Manager
- 非大道理谈创业团队的鬼门关