您好,登录后才能下订单哦!
密码登录
登录注册
点击 登录注册 即表示同意《亿速云用户服务条款》
# Java中如何实现函数式编程
## 目录
1. [函数式编程概述](#一函数式编程概述)
2. [Java函数式编程基础](#二java函数式编程基础)
3. [Lambda表达式详解](#三lambda表达式详解)
4. [函数式接口](#四函数式接口)
5. [方法引用与构造器引用](#五方法引用与构造器引用)
6. [Stream API](#六stream-api)
7. [Optional类](#七optional类)
8. [并发编程中的应用](#八并发编程中的应用)
9. [设计模式中的实践](#九设计模式中的实践)
10. [性能考量与最佳实践](#十性能考量与最佳实践)
11. [总结](#十一总结)
---
## 一、函数式编程概述
### 1.1 什么是函数式编程
函数式编程(Functional Programming)是一种编程范式,它将计算视为数学函数的求值,并避免改变状态和可变数据。核心特点包括:
- **纯函数**:相同输入永远得到相同输出
- **不可变性**:数据创建后不可修改
- **高阶函数**:函数可以作为参数/返回值
- **避免副作用**:不修改外部状态
### 1.2 与面向对象编程对比
| 特性 | 函数式编程 | 面向对象编程 |
|--------------|-------------------|-------------------|
| 基本单元 | 函数 | 对象 |
| 状态管理 | 不可变 | 可变 |
| 控制流 | 递归/组合 | 循环/条件 |
| 典型语言 | Haskell, Scala | Java, C++ |
### 1.3 Java的函数式演进
- Java 8(2014):Lambda、Stream API
- Java 9:Stream增强
- Java 11:局部变量类型推断(var)
- Java 16:Record类简化不可变对象
---
## 二、Java函数式编程基础
### 2.1 核心特性
```java
// 传统方式
Runnable r1 = new Runnable() {
@Override
public void run() {
System.out.println("Hello");
}
};
// Lambda表达式
Runnable r2 = () -> System.out.println("Hello");
@FunctionalInterface
interface MyFunction {
int apply(int x, int y);
}
MyFunction add = (a, b) -> a + b;
System.out.println(add.apply(2, 3)); // 输出5
(parameters) -> expression
或
(parameters) -> { statements; }
// 显式类型
BinaryOperator<Integer> add = (Integer x, Integer y) -> x + y;
// 类型推断
BinaryOperator<Integer> add = (x, y) -> x + y;
int base = 100;
IntUnaryOperator addBase = x -> x + base; // 有效final变量
接口 | 方法签名 | 示例 |
---|---|---|
Predicate<T> |
boolean test(T t) | 过滤条件 |
Function<T,R> |
R apply(T t) | 数据转换 |
Consumer<T> |
void accept(T t) | 打印操作 |
Supplier<T> |
T get() | 工厂方法 |
@FunctionalInterface
interface TriFunction<A,B,C,R> {
R apply(A a, B b, C c);
}
// 静态方法引用
Function<String, Integer> parser = Integer::parseInt;
// 实例方法引用
Consumer<String> printer = System.out::println;
// 对象方法引用
String str = "Hello";
Supplier<Integer> length = str::length;
// 构造器引用
Supplier<List<String>> listSupplier = ArrayList::new;
List<String> result = list.stream()
.filter(s -> s.startsWith("A")) // 中间操作
.map(String::toUpperCase) // 中间操作
.collect(Collectors.toList()); // 终止操作
long count = list.parallelStream()
.filter(s -> s.length() > 3)
.count();
Optional<String> opt = Optional.ofNullable(getString());
String value = opt.orElse("default");
Optional.of(user)
.map(User::getAddress)
.map(Address::getCity)
.ifPresent(System.out::println);
CompletableFuture.supplyAsync(() -> fetchData())
.thenApply(data -> process(data))
.thenAccept(result -> save(result));
public class Payment {
private final Function<Double, Boolean> strategy;
public Payment(Function<Double, Boolean> strategy) {
this.strategy = strategy;
}
public boolean pay(double amount) {
return strategy.apply(amount);
}
}
// 差
list.stream().map(x -> x.toUpperCase()).filter(x -> x.length()>2)...
// 好
list.stream()
.map(String::toUpperCase)
.filter(s -> s.length() > 2)
“面向对象编程通过封装不确定因素让代码被人理解,函数式编程通过减少不确定因素让代码被人理解。” —— Michael Feathers “`
(注:此为精简版框架,完整7350字版本需扩展每个章节的示例、原理分析、性能对比和实际案例,建议每部分增加:代码演示、注意事项、常见误区、性能数据等内容)
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。