当前位置: 首页 > article >正文

32 - Java 8 函数式接口

函数式接口

函数式接口(Functional Interface)就是一个有且仅有一个抽象方法,但是可以有多个非抽象方法的接口。
函数式接口可以被隐式转换为 lambda 表达式。
Lambda 表达式和方法引用(实际上也可认为是Lambda表达式)上。
如定义了一个函数式接口如下:
@FunctionalInterface interface GreetingService { void sayMessage(String message); }
那么就可以使用Lambda表达式来表示该接口的一个实现(注:JAVA 8 之前一般是用匿名类实现的):
GreetingService greetService1 = message -> System.out.println("Hello " + message);
函数式接口可以对现有的函数友好地支持 lambda。
JDK 1.8 之前已有的函数式接口:
  • java.lang.Runnable
  • java.util.concurrent.Callable
  • java.security.PrivilegedAction
  • java.util.Comparator
  • java.io.FileFilter
  • java.nio.file.PathMatcher
  • java.lang.reflect.InvocationHandler
  • java.beans.PropertyChangeListener
  • java.awt.event.ActionListener
  • javax.swing.event.ChangeListener
JDK 1.8 新增加的函数接口:
  • java.util.function
java.util.function 它包含了很多类,用来支持 Java的 函数式编程,该包中的函数式接口有:
序号
接口 & 描述
1
BiConsumer
代表了一个接受两个输入参数的操作,并且不返回任何结果
2
BiFunction
代表了一个接受两个输入参数的方法,并且返回一个结果
3
BinaryOperator
代表了一个作用于于两个同类型操作符的操作,并且返回了操作符同类型的结果
4
BiPredicate
代表了一个两个参数的boolean值方法
5
BooleanSupplier
代表了boolean值结果的提供方
6
Consumer
代表了接受一个输入参数并且无返回的操作
7
DoubleBinaryOperator
代表了作用于两个double值操作符的操作,并且返回了一个double值的结果。
8
DoubleConsumer
代表一个接受double值参数的操作,并且不返回结果。
9
DoubleFunction
代表接受一个double值参数的方法,并且返回结果
10
DoublePredicate
代表一个拥有double值参数的boolean值方法
11
DoubleSupplier
代表一个double值结构的提供方
12
DoubleToIntFunction
接受一个double类型输入,返回一个int类型结果。
13
DoubleToLongFunction
接受一个double类型输入,返回一个long类型结果
14
DoubleUnaryOperator
接受一个参数同为类型double,返回值类型也为double 。
15
Function
接受一个输入参数,返回一个结果。
16
IntBinaryOperator
接受两个参数同为类型int,返回值类型也为int 。
17
IntConsumer
接受一个int类型的输入参数,无返回值 。
18
IntFunction
接受一个int类型输入参数,返回一个结果 。
19
IntPredicate
:接受一个int输入参数,返回一个布尔值的结果。
20
IntSupplier
无参数,返回一个int类型结果。
21
IntToDoubleFunction
接受一个int类型输入,返回一个double类型结果 。
22
IntToLongFunction
接受一个int类型输入,返回一个long类型结果。
23
IntUnaryOperator
接受一个参数同为类型int,返回值类型也为int 。
24
LongBinaryOperator
接受两个参数同为类型long,返回值类型也为long。
25
LongConsumer
接受一个long类型的输入参数,无返回值。
26
LongFunction
接受一个long类型输入参数,返回一个结果。
27
LongPredicate
R接受一个long输入参数,返回一个布尔值类型结果。
28
LongSupplier
无参数,返回一个结果long类型的值。
29
LongToDoubleFunction
接受一个long类型输入,返回一个double类型结果。
30
LongToIntFunction
接受一个long类型输入,返回一个int类型结果。
31
LongUnaryOperator
接受一个参数同为类型long,返回值类型也为long。
32
ObjDoubleConsumer
接受一个object类型和一个double类型的输入参数,无返回值。
33
ObjIntConsumer
接受一个object类型和一个int类型的输入参数,无返回值。
34
ObjLongConsumer
接受一个object类型和一个long类型的输入参数,无返回值。
35
Predicate
接受一个输入参数,返回一个布尔值结果。
36
Supplier
无参数,返回一个结果。
37
ToDoubleBiFunction
接受两个输入参数,返回一个double类型结果
38
ToDoubleFunction
接受一个输入参数,返回一个double类型结果
39
ToIntBiFunction
接受两个输入参数,返回一个int类型结果。
40
ToIntFunction
接受一个输入参数,返回一个int类型结果。
41
ToLongBiFunction
接受两个输入参数,返回一个long类型结果。
42
ToLongFunction
接受一个输入参数,返回一个long类型结果。
43
UnaryOperator
接受一个参数为类型T,返回值类型也为T。

函数式接口实例

Predicate 接口是一个函数式接口,它接受一个输入参数 T,返回一个布尔值结果。
该接口包含多种默认方法来将Predicate组合成其他复杂的逻辑(比如:与,或,非)。
该接口用于测试对象是 true 或 false。
我们可以通过以下实例(Java8Tester.java)来了解函数式接口 Predicate 的使用:
import java.util.Arrays;
import java.util.List;
import java.util.function.Predicate;
 
public class Java8Tester {
   public static void main(String args[]){
      List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9);
        
      // Predicate<Integer> predicate = n -> true

      // n 是一个参数传递到 Predicate 接口的 test 方法

      // n 如果存在则 test 方法返回 true

        
      System.out.println("输出所有数据:");
        
      // 传递参数 n

      eval(list, n->true);
        
      // Predicate<Integer> predicate1 = n -> n%2 == 0

      // n 是一个参数传递到 Predicate 接口的 test 方法

      // 如果 n%2 为 0 test 方法返回 true

        
      System.out.println("输出所有偶数:");
      eval(list, n-> n%2 == 0 );
        
      // Predicate<Integer> predicate2 = n -> n > 3

      // n 是一个参数传递到 Predicate 接口的 test 方法

      // 如果 n 大于 3 test 方法返回 true

        
      System.out.println("输出大于 3 的所有数字:");
      eval(list, n-> n > 3 );
   }
    
   public static void eval(List<Integer> list, Predicate<Integer> predicate) {
      for(Integer n: list) {
        
         if(predicate.test(n)) {
            System.out.println(n + " ");
         }
      }
   }
}
执行以上脚本,输出结果为:
$ javac Java8Tester.java 
$ java Java8Tester
输出所有数据:
1 
2 
3 
4 
5 
6 
7 
8 
9 
输出所有偶数:
2 
4 
6 
8 
输出大于 3 的所有数字:
4 
5 
6 
7 
8 
9 


http://www.kler.cn/a/450321.html

相关文章:

  • 容器技术所涉及Linux内核关键技术
  • 美国加州房价数据分析01
  • C#(事件)2
  • JAVA HTTP压缩数据
  • layui动态拼接生成下拉框验证必填项失效问题
  • 0.96寸OLED显示屏详解
  • Light | 单点光场多维信息重构
  • 力扣-数据结构-1【算法学习day.72】
  • 【微信小程序】3|首页搜索框 | 我的咖啡店-综合实训
  • Linux——字符设备驱动控制LED
  • 高性能Web网关:OpenResty 基础讲解
  • 汽车IVI中控开发入门及进阶(46):FFmpeg
  • 常用网络协议
  • STM32高级物联网通信之以太网通讯
  • go语言并发文件备份,自动比对自动重命名(逐行注释)
  • 在【Arduino IDE】中在线下载和离线下载【ESP系列开发板的SDK】
  • Leetcode打卡:吃苹果的最大数目
  • 【直播电商】领域研究的综述(2024)·国内外混合方法分析—推文分析—2024-12-24
  • 电脑不小心删除了msvcr120.dll文件怎么办?“缺失msvcr120.dll文件”要怎么解决?
  • 监控易助力某市水利规划设计研究院信息化运维升级成功案例
  • 【算法day19】回溯:分割与子集问题
  • Qt如何将系统中使用的qDebug、qWarning等输出的信息显示到自定义的界面上或保存到文件中
  • Docker之技术架构【八大架构演进之路】
  • 验证面试常见问题系列
  • Python基础知识回顾
  • Apache Jmeter Liunx环境部署与接口压测