Java函数式编程
目录
1、函数式编程核心概念
1.1、什么是函数式编程
1.2、Java8的函数式支持
2、Lambda表达式
2.1、基本语法
2.2、使用示例
3、函数式接口
3.1、核心函数式接口
4、方法引用
4.1、示例代码
5、Stream API
5.1、流操作三个步骤
5.2、常用操作
6、Optional类
6.1、主要方法
6.2、使用示例
7、函数式编程实践
1、函数式编程核心概念
1.1、什么是函数式编程
- 函数可以像变量一样传递和使用
- 更加关注“做什么”而非“如何做”
- 函数不修改外部状态
- 避免可变状态
1.2、Java8的函数式支持
- Lambda表达式
- 方法引用
- Stream API
- Optional类
- 默认方法
- 函数式接口
2、Lambda表达式
2.1、基本语法
(parameters)-> expression 或者 (parameters) -> {statements;}
2.2、使用示例
// 传统匿名类
Runnable r1 = new Runnable() {
public void run() {
System.out.println("Hello");
}
};
// Lambda表达式,无参数,单号代码,省去{}和return
Runnable r2 = () -> System.out.println("Hello");
// 带参数的Lambda,多个参数
Comparator<String> c = (s1, s2) -> s1.compareToIgnoreCase(s2);
// 多行代码,单个参数可以省去()
Function<String, Integer> f = s -> {
System.out.println("Processing: " + s);
return s.length();
};
3、函数式接口
3.1、核心函数式接口
接口 | 方法 | 用途 |
---|---|---|
Function<T,R> | R apply(T t) | 传入T返回R |
Consumer<T> | void accept(T t) | 消费T无返回 |
Supplier<T> | T get() | 提供T型对象 |
Predicate<T> | Boolean test(T t) | 断言判断 |
UnaryOperator<T> | T apply(T t) | 一元运算 |
BinaryOperator<T> | T apply(T t1, T t2) | 二元运算 |
3.2、自定义函数式接口
@FunctionalInterface
interface StringProcessor {
String process(String input);
// 只能有一个抽象方法
default void info() {
System.out.println("Functional interface");
}
}
4、方法引用
- 静态方法引用:ClassName::staticMethod
- 实例方法引用:instance::method
- 任意对象方法引用:ClassName::method
- 构造方法引用:ClassName::new
4.1、示例代码
// 静态方法
Function<String, Integer> p = Integer::parseInt;
// 实例方法
Consumer<String> printer = System.out::println;
// 任意对象方法
Function<String, String> upper = String::toUpperCase;
// 构造方法
Supplier<List<String>> listSupplier = ArrayList::new;
5、Stream API
5.1、流操作三个步骤
1、创建流:集合、数组、I、O等
2、中间操作:过滤、映射、排序等
3、终端操作:收集、计算、遍历
5.2、常用操作
List<String> names = Arrays.asList("Alice", "Bob", "Charlie");
// 过滤和映射
List<String> result = names.stream()
.filter(s -> s.length() > 3)
.map(String::toUpperCase)
.collect(Collectors.toList());
// 分组
Map<Integer, List<String>> groupByLength = names.stream()
.collect(Collectors.groupingBy(String::length));
// 并行处理
long count = names.parallelStream()
.filter(s -> s.startsWith("A"))
.count();
6、Optional类
6.1、主要方法
-
of()
/ofNullable()
-
isPresent()
/ifPresent()
-
orElse()
/orElseGet()
/orElseThrow()
-
map()
/flatMap()
-
filter()
6.2、使用示例
Optional<String> opt = Optional.ofNullable(getName());
// 传统null检查
if (opt.isPresent()) {
System.out.println(opt.get());
}
// 函数式风格
opt.ifPresent(System.out::println);
// 链式操作
String result = opt.map(String::toUpperCase)
.orElse("DEFAULT");
7、函数式编程实践
// 传统方式
List<String> filtered = new ArrayList<>();
for (String name : names) {
if (name.length() > 3) {
filtered.add(name.toUpperCase());
}
}
// 函数式方式
List<String> filtered = names.stream()
.filter(n -> n.length() > 3)
.map(String::toUpperCase)
.collect(Collectors.toList());