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提升三:函数式接口的更多相关文章

  1. 【Java 8】函数式接口(一)—— Functional Interface简介

    什么是函数式接口(Functional Interface) 其实之前在讲Lambda表达式的时候提到过,所谓的函数式接口,当然首先是一个接口,然后就是在这个接口里面只能有一个抽象方法. 这种类型的接 ...

  2. 用好JAVA中的函数式接口,轻松从通用代码框架中剥离掉业务定制逻辑

    大家好,又见面了. 今天我们一起聊一聊JAVA中的函数式接口.那我们首先要知道啥是函数式接口.它和JAVA中普通的接口有啥区别?其实函数式接口也是一个Interface类,是一种比较特殊的接口类,这个 ...

  3. Java 之 常用函数式接口

    JDK提供了大量常用的函数式接口以丰富Lambda的典型使用场景,它们主要在 java.util.function 包中被提供.下面是最简单的几个接口及使用示例. 一.Supplier 接口 java ...

  4. Java 8 特性 —— 函数式接口

    函数式接口 概述:接口中只有一个抽象方法. 函数式接口,即适用于函数式编程场景的接口.而 Java 中的函数式编程体现就是 Lambda,所以函数式接口就是可以适用于 Lambda 使用的接口.只有确 ...

  5. Java 中的函数式接口

    java.util.function中定义了几组类型的函数式接口以及针对基本数据类型的子接口. Predicate -- 传入一个参数,返回一个bool结果, 方法为boolean test(T t) ...

  6. 【Java 8】函数式接口(二)—— 四大函数接口介绍

    前言 Java8中函数接口有很多,大概有几十个吧,具体究竟是多少我也数不清,所以一开始看的时候感觉一脸懵逼,不过其实根本没那么复杂,毕竟不应该也没必要把一个东西设计的很复杂. 几个单词 在学习了解之前 ...

  7. java中的函数式接口

    是什么?? 有且只有一个抽象方法的接口 场景: 适用于函数式编程场景(使用lambda表达式编程)的接口,函数式接口可以适用于lambda使用的接口. 只有确保接口中有且只有一个抽象方法,java中的 ...

  8. Java 基础三、接口与内部类

    1.   在Java程序语言中,接口是对类的一种描述.例如Arrays类中sort方法声明可以对对象进行排序,但前提是对象所属的类必须实现Comparable接口. public interface ...

  9. JAVA 8 函数式接口 - Functional Interface

    什么是函数式接口(Functional Interface) 其实之前在讲Lambda表达式的时候提到过,所谓的函数式接口,当然首先是一个接口,然后就是在这个接口里面只能有一个抽象方法. 这种类型的接 ...

随机推荐

  1. 每个 JavaScript 开发者都该懂的 Unicode

    英文原文标题:what-every-javascript-developer-should-know-about-unicode (译者注:本文含有Unicode辅助平面的特殊字符,部分浏览器可能无法 ...

  2. [转]No configuration found for the specified action 原因及解决方案

    转自 报错内容 警告: No configuration found for the specified action: 'login' in namespace: ''. Form action d ...

  3. P1045麦森数

    P1045麦森数 #include<iostream> #include <cmath> #include <cstring> const int maxn = 1 ...

  4. IDEA下的SVN设置以及TortoiseSVN安装后bin目录下没有svn.exe如何解决?

    1.首先,我们要确保电脑上已经安装了TortoiseSVN. 2.打开IDEA-File-Settings-Version Control-Subversion,在右边的界面上选择TortoiseSv ...

  5. HTML5模板引擎 Thymeleaf 教程(转)

    原文:http://www.open-open.com/lib/view/open1383622135586.html Thymeleaf是一个XML/XHTML/HTML5模板引擎,可用于Web与非 ...

  6. windows通过zip安装mysql5.7.26的一个坑

    需要将my.ini的 红框的/不能写成\ 注意编码格式问题 然后 mysqld --initialize-insecure mysqld --install net start mysql

  7. 学习黑马教学视频SSM整合中Security遇到的问题org.springframework.security.access.AccessDeniedException: Access is denied

    问题已解决. 总结: 报错:org.springframework.security.access.AccessDeniedException: Access is denied 当您遇到同样问题时, ...

  8. 设计模式课程 设计模式精讲 12-2 适配器模式coding

    1 重要 1.1 类适配器和对象适配器最大的区别 2 代码演练 2.1 代码演练1(类适配器模式) 2.2 代码演练2(对象适配模式) 2.3 代码演练3(具体应用场景) 1 重要 1.1 类适配器和 ...

  9. ProtoBuf开发者指南

    目录 1   概览 1.1   什么是protocol buffer 1.2   他们如何工作 1.3   为什么不用XML? 1.4   听起来像是为我的解决方案,如何开始? 1.5   一点历史 ...

  10. 2020-2-18 restful的学习

    1-1 restful简介及资源的介绍 restful   是什么? 本质:一种软件架构风格 核心:面向资源     解决的问题: 1. 降低开发的复杂性 2. 提高系统的可伸缩性     设计概念和 ...