Java函数式编程
函数式编程是一种“编程范式”,以函数为基本构建单元。在这种范式中,函数可以作为参数传递给其他函数、作为返回值返回,或赋值给变量。
由于Java不支持单独定义函数,我们可以将静态方法视为独立的函数,将实例方法视为自带
this
参数的函数。(from 函数式编程 - Java教程 - 廖雪峰的官方网站)
Java8引入了对函数式编程的支持,主要包括以下几个方面:
- 函数式接口:允许在方法中传递行为。
- Lambda表达式:允许用简洁的方式来表示函数,简化了匿名内部类的写法。
- Stream API:支持对集合进行函数式操作,如过滤、映射、聚合等,并且支持使用并行流提高性能。
- Optional:用于处理可能为null的值,避免
NullPointerException
。
函数式接口
函数式接口是仅包含一个方法的接口,只提供一个功能,通过这些接口我们可以实现行为在方法间的传递。比如Runnable、Comparable、Callable都可以视为函数式接口。
Java 8引入了java.util.function
包,包含多个常用的函数式接口:Function<T,R>
、Consumer<T>
、Supplier<T>
,Predicate<T>
、UnaryOperator<T>
、BinaryOperator<T>
,并且在Java 8之后可以用lambda表达式来进行实例化。
1 | public class LambdaTest { |
Lambda表达式
Lambda表达式是Java 8引入的一种语法,用于简化函数式编程中匿名内部类的使用。
1 | // 匿名内部类写法 |
除此之外,还提供了方法引用,可以进一步简化对现有方法的引用。
1 | Function<Double, Double> sqrt = Math::sqrt; // 静态方法引用 |
Stream API
Stream API支持对集合进行函数式操作,如过滤、映射、聚合等,并且支持使用并行流提高性能。
一般包括三步:创建流、中间操作、终止操作。
1 | class StreamTest { |
区分map
、reduce
、collect
map
是一个中间操作,用于将流中的每个元素应用给定的函数,转换为另一种类型或形式,返回流。reduce
是一个终止操作,用于将流中的所有元素聚合成一个单一的值,通常用于计算总和、乘积等,返回Optional
。collect
是一个终止操作,用于将流中的元素收集到一个集合、字符串或其他形式的结果,通常用于转换流为可用的数据结构。
Optional
在Stream的部分终止操作会返回Optional,比如max\min\findFirst\findAny
1 | class OptionalTest{ |
例子
1 | public static int sumOfEvenNumbers(List<Integer> numbers) { |
评论