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. 0X01应用程序黑客技术

    前言 该文章主要是讲解了常见的应用程序黑客技术基本概念,包括消息钩取,API钩取,DLL注入,代码注入 天象独行 0X01:消息钩取 原理:在我们通过键盘,鼠标等输入信息过程中,Windows会通过钩 ...

  2. git pull 之后怎么找回别覆盖掉的内容

    [半夜吓出冷汗,git这个原理还真得好好学学] 不小心把本地写的东西pull了下,然后,全部覆盖掉了,以为就这样没了. 后面想到有“时光穿梭机”,“历史回滚”,在各大群友的帮助下,终于找回了. git ...

  3. Java基础 -4.4

    For循环 for循环也是一种常规的使用结构 public static void main(String[] args) { for(定义循环的初始值;循环判断;修改循环条件) { 循环语句的执行; ...

  4. Python学习笔记003

    windows环境配置 系统变量: Path: D:\Program Files\Python35\Scripts\; D:\ProgramFiles\Python35\; D:\Program Fi ...

  5. Spring Mvc中Jsp也页面怎么会获取不到Controller中的数据

    ----------Controller ------- package com.test.mvc; import org.springframework.stereotype.Controller; ...

  6. 初识Python和使用Python爬虫

     一.python基础知识了解:   1.特点: Python的语言特性: Python是一门具有强类型(即变量类型是强制要求的).动态性.隐式类型(不需要做变量声明).大小写敏感(var和VAR代表 ...

  7. express框架安装及中间件原理

    本文主要介绍express中间件的原理,来应对面试. 1.安装express及初始化: npm install express-generator -g   =>   express expre ...

  8. Sublime设置html头部

    1.Ctrl + N,新建一个文档:2.Ctrl + Shift + P,打开命令模式,再输入 sshtml 进行模糊匹配,将语法切换到html模式:3.输入 !,再按下 Tab键或者 Ctrl + ...

  9. 302重定向之后,session中存储的值没了

    302重定向之后,session中存储的值没了

  10. Windows API 常用函数---转载

    Windows API 常用函数 2014-10-15 14:21  xiashengwang  阅读(2105)  评论(0)  编辑  收藏 .Net中虽然类库很强的,但还是有些时候功能有限,掌握 ...