上一篇小乐带大家学过 Java8新特性-Lambda表达式,那什么时候可以使用Lambda?通常Lambda表达式是用在函数式接口上使用的。从Java8开始引入了函数式接口,其说明比较简单:函数式接口(Functional Interface)就是一个有且仅有一个抽象方法,但是可以有多个非抽象方法的接口。 java8引入@FunctionalInterface 注解声明该接口是一个函数式接口。

1、语法定义

  1. /**
  2. * 定义函数式接口
  3. * 接口上标注@FunctionalInterface 注解
  4. */
  5. @FunctionalInterface
  6. public interface ICollectionService {
  7. /**
  8. * 定义打印方法
  9. */
  10. void print();
  11. }

  

在Java8 以前,已有大量函数式接口形式的接口(接口中只存在一个抽象方法),只是没有强制声明。例如:

  • java.lang.Runnable
  • java.util.concurrent.Callable
  • java.security.PrivilegedAction
  • java.io.FileFilter
  • java.nio.file.PathMatcher
  • java.lang.reflect.InvocationHandler
  • java.beans.PropertyChangeListener
  • java.awt.event.ActionListener
  • javax.swing.event.ChangeListener

Java8 新增加的函数接口在java.util.function 包下,它包含了很多类,用来支持 Java的 函数式编程,该包中的函数式接口有:

对于Java8中提供的这么多函数式接口,开发中常用的函数式接口有以下几个:

 Predicate,Consumer,Function,Supplier
 

2、函数式接口实例

2.1、Predicate

java.util.function.Predicate<T> 接口定义了一个名叫 test 的抽象方法,它接受泛型 T 对象,并返回一个boolean值。在对类型 T进行断言判断时,可以使用这个接口。通常称为断言性接口 。

使用Predicate接口实现字符串判空操作

  1. @FunctionalInterface
  2. public interface Predicate<T> {
  3.  
  4. /**
  5. * Evaluates this predicate on the given argument.
  6. *
  7. * @param t the input argument
  8. * @return {@code true} if the input argument matches the predicate,
  9. * otherwise {@code false}
  10. */
  11. boolean test(T t);
  12. ...
  13. }
  14.  
  15. public static void main(String[] args) {
  16. /**
  17. * 借助Lambda 表达式实现Predicate test方法
  18. */
  19. Predicate<String> p01=(str)->str.isEmpty()||str.trim().isEmpty();
  20. /**
  21. * 测试传入的字符串是否为空
  22. */
  23. System.out.println(p01.test(""));
  24. System.out.println(p01.test(" "));
  25. System.out.println(p01.test("admin"));
  26. }

  

测试代码

  1. public static void main(String[] args) {
  2. /**
  3. * 借助Lambda 表达式实现Predicate test方法
  4. */
  5. Predicate<String> p01=(str)->str.isEmpty()||str.trim().isEmpty();
  6. /**
  7. * 测试传入的字符串是否为空
  8. */
  9. System.out.println(p01.test(""));
  10. System.out.println(p01.test(" "));
  11. System.out.println(p01.test("admin"));
  12. }

  

测试结果:

2.2、Consumer

java.util.function.Consumer<T>接口定义了一个名叫 accept 的抽象方法,它接受泛型T,没有返回值(void)。如果需要访问类型 T 的对象,并对其执行某些操作,可以使用这个接口,通常称为消费性接口。

使用Consumer实现集合遍历操作:

  1. @FunctionalInterface
  2. public interface Consumer<T> {
  3.  
  4. /**
  5. * Performs this operation on the given argument.
  6. *
  7. * @param t the input argument
  8. */
  9. void accept(T t);
  10. ...
  11. }
  12.  
  13. /**
  14. * 借助Lambda表达式实现Consumer accept方法
  15. */
  16. Consumer<Collection> c01 = (collection) -> {
  17. if (null != collection && collection.size() > 0) {
  18. for (Object c : collection) {
  19. System.out.println(c);
  20. }
  21. }
  22. };
  23.  
  24. List<String> list = new ArrayList<String>();
  25. list.add("诸葛亮");
  26. list.add("曹操");
  27. list.add("关羽");
  28.  
  29. // 遍历list 输出元素内容到控制台
  30. c01.accept(list);

  

2.3、Function

java.util.function.Function<T, R>接口定义了一个叫作apply的方法,它接受一个泛型T的对象,并返回一个泛型R的对象。如果需要定义一个Lambda,将输入的信息映射到输出,可以使用这个接口(比如提取苹果的重量,或把字符串映射为它的长度),通常称为功能性接口。

使用Function实现用户密码 Base64加密操作:

  1. @FunctionalInterface
  2. public interface Function<T, R> {
  3.  
  4. /**
  5. * Applies this function to the given argument.
  6. *
  7. * @param t the function argument
  8. * @return the function result
  9. */
  10. R apply(T t);
  11. }
  12.  
  13. // 实现用户密码 Base64加密操作
  14. Function<String,String> f01=(password)->Base64.getEncoder().encodeToString(password.getBytes());
  15. // 输出加密后的字符串
  16. System.out.println(f01.apply("123456"));

  

加密后结果如下:

2.4、Supplier

java.util.function.Supplier<T>接口定义了一个get的抽象方法,它没有参数,返回一个泛型T的对象,这类似于一个工厂方法,通常称为功能性接口。

使用Supplier实现SessionFactory创建:

  1. @FunctionalInterface
  2. public interface Supplier<T> {
  3.  
  4. /**
  5. * Gets a result.
  6. *
  7. * @return a result
  8. */
  9. T get();
  10. }
  11.  
  12. /**
  13. * 产生一个session工厂对象
  14. */
  15. Supplier<SessionFactory> s = () -> {
  16. return new SessionFactory();
  17. };
  18.  
  19. s.get().info();

  

以上就是小乐带给大家的Java8新特性之函数式接口,下一篇将会为大家带来Java8新特性之方法引用,敬请关注。

转载请注明文章出处和作者,谢谢合作!

乐字节-Java8新特性之函数式接口的更多相关文章

  1. 乐字节-Java8新特性-接口默认方法

    总概 JAVA8 已经发布很久,而且毫无疑问,java8是自java5(2004年发布)之后的最重要的版本.其中包括语言.编译器.库.工具和JVM等诸多方面的新特性. Java8 新特性列表如下: 接 ...

  2. 乐字节-Java8新特性之Base64和重复注解与类型注解

    上一篇小乐给大家说了<乐字节-Java8新特性之Date API>,接下来小乐继续给大家说一说Java8新特性之Base64和重复注解与类型注解. 一.Base64 在Java 8中,内置 ...

  3. 乐字节-Java8新特性-Lambda表达式

    上一篇文章我们了解了Java8新特性-接口默认方法,接下来我们聊一聊Java8新特性之Lambda表达式. Lambda表达式(也称为闭包),它允许我们将函数当成参数传递给某个方法,或者把代码本身当作 ...

  4. 乐字节-Java8新特性-接口默认方法之Stream流(下)

    接上一篇:<Java8新特性之stream>,下面继续接着讲Stream 5.流的中间操作 常见的流的中间操作,归为以下三大类:筛选和切片流操作.元素映射操作.元素排序操作: 操作 描述 ...

  5. 乐字节-Java8新特性之方法引用

    上一篇小乐介绍了<Java8新特性-函数式接口>,大家可以点击回顾.这篇文章将接着介绍Java8新特性之方法引用. Java8 中引入方法引用新特性,用于简化应用对象方法的调用, 方法引用 ...

  6. 乐字节-Java8新特性之Stream流(上)

    上一篇文章,小乐给大家介绍了<Java8新特性之方法引用>,下面接下来小乐将会给大家介绍Java8新特性之Stream,称之为流,本篇文章为上半部分. 1.什么是流? Java Se中对于 ...

  7. 乐字节-Java8新特性之Date API

    上一篇文章,小乐给大家带来了Java8新特性之Optional,接下来本文将会给大家介绍Java8新特性之Date API 前言: Java 8通过发布新的Date-Time API来进一步加强对日期 ...

  8. 乐字节-Java8新特性之Optional

    上一篇小乐带大家了解了Java新特性之Stream,接下来将会继续述说Java新特性之Optional Optional<T>类(java.util.Optional)是一个容器类,代表一 ...

  9. Java8新特性之函数式接口

    <Java 8 实战>学习笔记系列 定义 函数式接口只定义一个抽象方法,可以有多个默认方法 函数式接口的接口名上,会被@FunctionalInterface标注 作用 函数式接口的方法可 ...

随机推荐

  1. UWP Background过渡动画

    首先说两件事: 1.大爆炸我还记着呢,先欠着吧... 2.博客搬家啦,新地址:https://blog.ultrabluefire.cn/ ==========下面是正文========== 前些日子 ...

  2. 「PKUSC2018」真实排名(排列组合,数学)

    前言 为什么随机跳题会跳到这种题目啊? Solution 我们发现可以把这个东西分情况讨论: 1.这个点没有加倍 这一段相同的可以看成一个点,然后后面的都可以. 这一段看成一个点,然后前面的不能对他造 ...

  3. Weekly Contest 133

    1030. Matrix Cells in Distance Order We are given a matrix with R rows and C columns has cells with ...

  4. GoLang学习控制语句之if/else

    if语句 if 是用于测试某个条件(布尔型或逻辑型)的语句,如果该条件成立,则会执行 if 后由大括号括起来的代码块,否则就忽略该代码块继续执行后续的代码. if condition { // do ...

  5. linux中jdk的安装与配置

    一.卸载系统已有的JDK 1.查看已安装的jdk rpm -qa|grep jdk 2.卸载jdk rpm -e --nodeps java-1.6.0-openjdk-1.6.0.0-1.66.1. ...

  6. cStringIO 实现指定大小的字符串缓存

    StringIO经常被用来作为字符串的缓存,以下实现无论写入多少字符串,总能返回一个指定大小的缓存 from cStringIO import StringIO class CustomStringI ...

  7. JS数组去重的几种常见方法

    JS数组去重的几种常见方法 一.简单的去重方法 // 最简单数组去重法 /* * 新建一新数组,遍历传入数组,值不在新数组就push进该新数组中 * IE8以下不支持数组的indexOf方法 * */ ...

  8. 基于GTK+3 开发远程控制管理软件(C语言实现)系列三 Windows7开发环境搭建

    一.介绍与准备 考虑到目标客户端基本都是windows客户端,所以此次开发环境将搭建在windows7下,相关开发工具有Msys2 和 Eclipse For C/C++ Msys2 是msys的升级 ...

  9. String、StringBuffer与StringBuilder之间区别 (转载)

    最近学习到StringBuffer,心中有好些疑问,搜索了一些关于String,StringBuffer,StringBuilder的东西,现在整理一下. 关于这三个类在字符串处理中的位置不言而喻,那 ...

  10. Django Admin实现三级联动(省市区)

    通过自定义Admin的模板文件实现省市区的三级联动.要求创建记录时,根据省>市>区的顺序选择依次显示对应数据. 修改记录时默认显示已存在的数据. Model class Member(mo ...