函数式编程(Functional Programming)是一种编程范式,强调使用纯函数作为程序的基本构建块,避免使用可变状态和可变数据。Java作为一种面向对象的编程语言,自从引入了Lambda表达式、Stream API和Optional类,也开始在语言层面支持函数式编程。
Lambda表达式
Lambda表达式是Java 8引入的一种语法糖,用来简化匿名内部类的编写。Lambda表达式以一个箭头(->)分隔参数列表和函数体,可以通过Lambda表达式来创建匿名函数。
() -> System.out.println("Hello, world!");
Lambda表达式有以下特点:
- 可以被看作一种函数的实现,因此可以赋值给函数式接口变量。
- 可以省略函数式接口参数的显示类型声明。
- 可以省略函数体的大括号,当函数体只有一条语句的时候。
Lambda表达式的常见用法包括集合的遍历、筛选、映射等操作。例如,我们可以使用Lambda表达式来对一个集合进行遍历并输出每个元素:
List<String> names = Arrays.asList("Alice", "Bob", "Charlie");
names.forEach(name -> System.out.println(name));
Stream API
Stream API是Java 8引入的一种用于处理集合数据的API。它提供了许多高阶函数(Higher-Order Functions)用于对集合进行函数式操作,如筛选、变换、聚合等。
Stream操作可以分为中间操作和末端操作。中间操作不会直接触发执行,而是返回一个新的Stream对象,可以进行链式调用。末端操作是触发Stream的执行,返回某种结果或者不返回结果。
List<String> names = Arrays.asList("Alice", "Bob", "Charlie");
// 筛选出名字长度大于4的人
List<String> result = names.stream()
.filter(name -> name.length() > 4)
.collect(Collectors.toList());
Stream API的特点包括:
- 惰性求值:中间操作不会立即执行,只有在末端操作被调用时才会触发执行。
- 并行计算:Stream可以使用多线程来进行并行计算,提高性能。
- 不可变性:Stream的操作不会修改原始集合,而是返回一个新的Stream对象。
Optional类
Optional类是Java 8引入的用于处理可能为空的值(Null Value)的类。它提供了一些方法来处理可能为空的值,避免了NullPointerException的出现。
Optional类可以包含一个非空的值,也可以为空。当Optional为空时,调用get方法将会抛出NoSuchElementException异常。因此,在使用Optional类的时候,我们需要使用isPresent方法先判断Optional是否为空。
Optional<String> name = Optional.ofNullable("Alice");
// 如果name不为空,则打印name的值
name.ifPresent(value -> System.out.println(value));
Optional类的主要用法有:
- ofNullable方法:用于创建一个可能为空的Optional对象。
- isPresent方法:判断Optional是否包含一个非空的值。
- ifPresent方法:判断Optional是否包含一个非空的值,并在包含的情况下执行相关操作。
总结
函数式编程是一种强调使用纯函数进行编程的范式,Java在语言层面支持函数式编程,通过Lambda表达式、Stream API和Optional类可以更方便地进行函数式编程。
Lambda表达式是Java 8引入的一种语法糖,用来简化匿名内部类的编写,常用于集合的遍历和操作。
Stream API是Java 8引入的用于处理集合数据的API,提供了丰富的高阶函数用于对集合进行函数式操作,如筛选、变换、聚合等。
Optional类是Java 8引入的用于处理可能为空的值的类,提供了一些方法来处理可能为空的值,避免NullPointerException的出现。
本文来自极简博客,作者:编程语言译者,转载请注明原文链接:Java中的函数式编程:从Lambda到Stream再到Optional