转载自:https://www.runoob.com/java/java8-functional-interfaces.html
****
**1. 什么是函数式接口**
函数式接口(Functional Interface)就是<mark>一个有且仅有一个抽象方法,但是可以有多个非抽象方法的接口</mark>。
* 函数式接口可以被隐式转换为 lambda 表达式。
* Lambda 表达式和方法引用(实际上也可认为是Lambda表达式)上。
**2. 定义一个函数式接口的例子**
```java
public class FunctionalInterfaceDemo {
/**
* 定义函数式接口 GreetingService。
* 加不加注解 @FunctionalInterface 对于接口是不是函数式接口没有影响,
* 该注解只是提醒编译器去检查该接口是否仅包含一个抽象方法,即是否符合函数式接口的定义。
*
*/
@FunctionalInterface
interface GreetingService {
void sayMessage(String message);
}
public static void main(String[] args) {
GreetingService greetingService = message -> System.out.println("Hello " + message);
greetingService.sayMessage("Tom");
//Hello Tom
}
}
```
<br/>
**3. jdk 1.8之前以及 jdk 1.8 提供的函数式接口**
jdk 1.8之前以及 jdk 1.8 提供的函数式接口有哪些参考:https://www.runoob.com/java/java8-functional-interfaces.html 。
<br/>
下面演示函数式接口`java.util.function.Predicate<T>`的使用。
Predicate <T> 接口是一个函数式接口,它接受一个输入参数 T,返回一个布尔值结果。
该接口包含多种默认方法来将 Predicate 组合成其他复杂的逻辑(比如:与,或,非)。
该接口用于测试对象是 true 或 false。
```java
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> p1 = n -> n == 5;
System.out.println("n是否等于5:" + p1.test(5));
//n是否等于5:true
System.out.println("输出所有数据:");
eval(list, n -> true);
//1 2 3 4 5 6 7 8 9
System.out.println("输出所有偶数:");
eval(list, n -> n % 2 == 0);
//2 4 6 8
System.out.println("输出大于 3 的所有数字:");
eval(list, n -> n > 3);
//4 5 6 7 8 9
}
public static void eval(List<Integer> list, Predicate<Integer> predicate) {
for (Integer n : list) {
if (predicate.test(n)) {
System.out.print(n + " ");
}
}
}
}
```
- 网络通信
- 网络协议
- 端口和套接字
- TCP网络程序
- UDP网络程序
- 多线程聊天室
- 多线程
- 线程相关概念
- 线程实现方式
- 中断线程
- 线程生命周期
- 线程优先级
- 优先级规则
- 案例演示
- 线程同步机制
- 线程同步机制
- synchronized关键字
- ReentrantLock类
- Condition类
- 监视器概念
- volatile关键字
- final变量
- 死锁
- 线程局部变量
- 读/写锁
- 原子类
- 阻塞队列
- 工作规则
- 案例演示
- 常用阻塞队列
- 线程安全集合
- 高效的映射/集/队列
- 并发集视图
- 写数组的拷贝
- Arrays类的并行数组算法
- 同步包装器
- Callable与Future
- 执行器
- 线程池
- 预定执行
- 控制任务组
- Fork-Join框架
- 同步器
- 同步器
- 信号量
- CountDownLatch类
- CyclicBarrier类
- Exchanger类
- SynchronousQueue类
- 线程与Swing
- Swing与线程问题
- 两个原则
- Swing工作线程
- 单一线程规则
- 文件IO
- File类
- 文件输入输出
- ZIP压缩文件
- 集合
- 集合框架
- 集合接口
- 集合实现类
- 线程安全集合
- 集合算法
- 迭代器
- 集合排序
- JDBC
- JDBC是什么
- JDBC-ODBC桥
- JDBC驱动程序类型
- JDBC常用类与接口
- 数据库操作
- 连接数据库
- 增/删/改/查/预处理
- 事务
- 批处理
- commons-dbutils工具
- 安全问题
- Jedis
- 使用Jedis操作Redis数据库
- JSON转换
- 使用连接池
- 案例
- 单例破坏
- 单例定义
- 单例实现方式
- 懒汉式实现单例
- 饿汉式实现单例
- 单例破坏
- 类的单例破坏
- 枚举的单例破坏
- 克隆
- 克隆是什么
- 浅克隆
- 深克隆
- 注解
- 注解是什么
- 三大注解
- 内置注解
- 元注解
- 自定义注解
- NIO
- 相关概念
- BIO/NIO/AIO
- 多线程编程
- 线程同步
- 线程通信
- NIO
- NIO三大核心组件
- NIO网络编程
- NIO文件读写
- AIO
- Java8新特性
- Lambda表达式
- 方法引用
- 函数式接口
- 默认方法
- 什么是默认方法
- 默认方法语法格式
- 多个同名的默认方法问题
- 静态默认方法
- 默认方法实例
- Stream
- Stream是什么
- Stream示例
- Optional容器
- 新的日期时间API
- Base64
- SPI
- SPI是什么
- SPI与API的区别
- 常见场景
- 使用SPI需遵循的约定
- SPI使用步骤