Java提升三:函数式接口
1、 定义
函数式接口即是有且仅有一个抽象方法的接口。
注意:
(1)函数式接口只对于抽象方法有要求,对于接口中的默认方法,静态方法,私有方法数量并不作特殊要求。
(2)既然函数式接口定义了抽象方法,则对于函数式接口进行实现的类必须要实现其定义的抽象方法。
2、 函数式接口的创建
(1)直接定义一个只包含一个抽象方法的接口即可。
(2)在创建类时,使用@FunctionalInterface注解。示例如下:
@FunctionalInterface
interface MyFunctionInterface{
//定义一个抽象方法
public abstract void method();
}
3、 函数式接口的作用
函数式接口一般可以作为方法的参数或返回值类型。举一个应用的列子:
public class FunctionInterfaceUse {
//定义一个方法,参数使用函数式接口
public static void show(MyFunctionInterface myinter) {
myinter.method();
}
public static void main(String[] args) {
//调用show方法,因为方法的参数是一个接口,
//所以可以传递接口的匿名内部类
show(new MyFunctionInterface() {
@Override
public void method() {
System.out.println("使用匿名内部类,重写接口中的抽象方法");
}
});
//调用show方法,因为方法的参数是一个函数式接口,
//所以可以使用Lambda表达式
show(()->{
System.out.println("使用lambda表达式,重写接口中的抽象方法");
});
}
}
4、常用的函数式接口
4.1 Supplier接口:生产型接口。
Supplier接口的泛型是什么类型, 调用Supplier接口中唯一的抽象方法get时,就会生产什么类型的数据。
抽象方法 T get();
代码示例:
public class MultiFuntionInterface {
//Supplier的使用
public static String getString(Supplier<String> sup) {
return sup.get();
}
public static void main(String[] args) {
//调用getstring方法
String s=getString(()->{
//生产一个字符串并返回
return "jay";
});
System.out.println(s);
}
}
4.2 Consumer接口:消费性接口。
Consumer接口中的泛型为什么类型,就可以使用Consumer接口中的抽象方法accept接收什么类型的数据,至于如何使用,需要对于该方法进行自定义实现。
抽象方法 void accept(T t);
默认方法 Consumer andThen(Consumer<? super T> after);
andThen方法用于连接两个消费性接口,共享同一个接受数据。两个消费性接口谁在前,谁先消费。
代码示例:
public class MultiFuntionInterface {
//Consumer接口的使用
public static void method(String name,Consumer<String> con){
con.accept(name);
}
//Consumer接口的使用,两种使用
public static void method2(String name,Consumer<String> con1,Consumer<String> con2) {
con1.accept(name);
con2.accept(name);
//使用andThen方法,将两个接口连接,再进行消费
con1.andThen(con2).accept(name);//该语句与以上两个语句效果等价
}
public static void main(String[] args) {
//Consumer接口的使用method
method("jj",(name)->{
//对传递的字符进行消费
System.out.println(name);
//消费方式:把字符串翻转
String aname=new StringBuilder(name).reverse().toString();
System.out.println(aname);
});
//Consumer接口的使用method2
method2("jay",(name)->{
System.out.println(name.toUpperCase());
},(name)->{
System.out.println(name.toLowerCase());
});
}
}
4.3 predicate接口:判断型接口
predicate接口对test方法的输入参数和泛型类型的数据进行判断,相等为true,不等为false,从而得到一个boolean值。
抽象方法: boolean test(T t);
默认方法: 默认方法用来连接多个判断性接口对于数据的判断接口。逻辑运算方法有以下三种:
Predicate<T> and(Predicate<? super T> other):与
Predicate<T> or (Predicate<? super T> other):或
Predicate<T> not(Predicate<? super T> other):非
代码示例:
public class MultiFuntionInterface {
//Predicate函数式接口的使用
public static boolean judgeMethod(String s,Predicate<String> pre){
return pre.test(s);
}
//Predicate函数式接口的使用,两个条件
public static boolean judgeMethod1(String s,Predicate<String> pre,Predicate<String> pre1){
//return pre.test(s)&&pre1.test(s);
return pre.and(pre1).test(s);
//return pre.or(pre1).test(s);
//return pre.negate().test(s);
}
public static void main(String[] args) {
//Predicate的使用
String s1="abcd";
boolean b=judgeMethod(s1,(String str)->{
return str.length()>5;
});
System.out.println(b);
boolean b1=judgeMethod1(s1,(String str)->{
//判断字符串长度是否大于5
return str.length()>5;
},(String str)->{
//判断字符串中是否包含a
return str.contains("a");
});
System.out.println(b1);
}
}
4.4 Function<T,R>:转换型接口。
Function<T,R>接口中的抽象方法apply将一个类型T的数据转化后得到另一个类型R的数据。
抽象方法: R apply(T t); 输入形参类型为T,返回值类型为R。
默认方法: 用以组合操作,区别如下:
andThen(Function<? super R,? extends V> after):谁调用的andThen,谁执行时在前。
compose(Function<? super V,? extends T> before):谁调用的compose,谁执行时在后。
代码示例:
public class MultiFuntionInterface {
//Function<T,R>类型的使用
public static void changeType(String s, Function<String,Integer> f){
Integer in=f.apply(s);//接收String类型,返回Integer类型
System.out.println(in);
}
public static void main(String[] args) {
//Function接口的使用
changeType(s,(String str)->{
//接口的具体实现
return Integer.parseInt(str);
});
//默认方法andThen的使用
Function<String, String> function = a -> a + " 小明!";
Function<String, String> function1 = a -> a + " 张三!";
String greet = function.andThen(function1).apply("你好");
System.out.println(greet); // 你好 小明! 张三!
//默认方法compose的使用
Function<String, String> function = a -> a + " 小明!";
Function<String, String> function1 = a -> a + " 张三!";
String greet = function.compose(function1).apply("你好");
System.out.println(greet); // 你好 张三! 小明!
}
Java提升三:函数式接口的更多相关文章
- 【Java 8】函数式接口(一)—— Functional Interface简介
什么是函数式接口(Functional Interface) 其实之前在讲Lambda表达式的时候提到过,所谓的函数式接口,当然首先是一个接口,然后就是在这个接口里面只能有一个抽象方法. 这种类型的接 ...
- 用好JAVA中的函数式接口,轻松从通用代码框架中剥离掉业务定制逻辑
大家好,又见面了. 今天我们一起聊一聊JAVA中的函数式接口.那我们首先要知道啥是函数式接口.它和JAVA中普通的接口有啥区别?其实函数式接口也是一个Interface类,是一种比较特殊的接口类,这个 ...
- Java 之 常用函数式接口
JDK提供了大量常用的函数式接口以丰富Lambda的典型使用场景,它们主要在 java.util.function 包中被提供.下面是最简单的几个接口及使用示例. 一.Supplier 接口 java ...
- Java 8 特性 —— 函数式接口
函数式接口 概述:接口中只有一个抽象方法. 函数式接口,即适用于函数式编程场景的接口.而 Java 中的函数式编程体现就是 Lambda,所以函数式接口就是可以适用于 Lambda 使用的接口.只有确 ...
- Java 中的函数式接口
java.util.function中定义了几组类型的函数式接口以及针对基本数据类型的子接口. Predicate -- 传入一个参数,返回一个bool结果, 方法为boolean test(T t) ...
- 【Java 8】函数式接口(二)—— 四大函数接口介绍
前言 Java8中函数接口有很多,大概有几十个吧,具体究竟是多少我也数不清,所以一开始看的时候感觉一脸懵逼,不过其实根本没那么复杂,毕竟不应该也没必要把一个东西设计的很复杂. 几个单词 在学习了解之前 ...
- java中的函数式接口
是什么?? 有且只有一个抽象方法的接口 场景: 适用于函数式编程场景(使用lambda表达式编程)的接口,函数式接口可以适用于lambda使用的接口. 只有确保接口中有且只有一个抽象方法,java中的 ...
- Java 基础三、接口与内部类
1. 在Java程序语言中,接口是对类的一种描述.例如Arrays类中sort方法声明可以对对象进行排序,但前提是对象所属的类必须实现Comparable接口. public interface ...
- JAVA 8 函数式接口 - Functional Interface
什么是函数式接口(Functional Interface) 其实之前在讲Lambda表达式的时候提到过,所谓的函数式接口,当然首先是一个接口,然后就是在这个接口里面只能有一个抽象方法. 这种类型的接 ...
随机推荐
- mac 终端连接服务器报错
今天在连接虚拟机服务器时突然报了一个 WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!的错误.  会出现这个错误的原因是在第一次进行SSH连接时,会生 ...
- 攻防世界Web进阶-Upload1
进入题目 题目提示上传文件,准备好一句话木马. 发现只能上传图片文件,那么再准备一个图片的一句话木马.上传. 浏览器开代理,使用burpsuite拦截,修改文件后缀名为php,否则无法连接 使用蚁剑连 ...
- Linux命令:iostat命令
Linux系统中的 iostat是I/O statistics(输入/输出统计)的缩写,iostat工具将对系统的磁盘操作活动进行监视.它的特点是汇报磁盘活动统计情况,同时也会汇报出CPU使用情况.同 ...
- 用instsrv.exe+srvany.exe将应用程序安装为windows服务
下载 链接:https://pan.baidu.com/s/1gKu_WwVo-TeWXmrGAr9qjw 提取码:s1vm 用instsrv.exe安装srvany.exe 将instsrv.exe ...
- redhat 7.6 用户和组
用户 useradd user1 //新建用户user1 userdel user1 //删除用户user1 userdel -r user1 //删除用户并且删除h ...
- 吴裕雄--天生自然HADOOP操作实验学习笔记:ETL案例
实验目的 熟悉hadoop生态系统 初步了解大数据点击流分析业务 学会使用hadoop进行数据分析统计 实验原理 hadoop主要有三部分,hdfs做数据存储.mapreduce做数据计算.yarn做 ...
- 如何更改linux(centos)下的Apache http端口号
# vi /etc/httpd/conf/httpd.conf 文件 修改两个地方 #Listen 12.34.56.78:80 Listen 80 #把80改为你设置的端 ...
- Date.parse在IE/Firefox下有兼容性问题
原因: IE和Firefox是不支持含有'-'字符的日期格式,如:"2018-11-23" 解决方法: 日期格式 'yyyy-mm-dd' 改成 'yyyy/mm/dd' 代码: ...
- No qualifying bean of type 'org.springframework.ui.Model' available
原因:@Autowired 下面没有注入类
- popupwindow使用之异常:unable to add window -- token null is not valid
使用popwindow中又碰到一个白痴问题,在此留作纪念,希望对大家有帮助 popupwindow之所以叫这个名字,肯定是要从某个地方弹出啦,但是从哪个地方呢?必须是指定一个view嘛 void an ...