编程范式
- 命令式编程
- 函数式编程
- 响应式编程
函数式编程
释义:
通过函数来定义、封装及组合计算逻辑。其核心特性之一是数据不可变性(immutability),即数据一旦被创建,其值便固定不变,无法被后续操作修改。这一特性促使函数式编程倾向于避免使用状态(state)和可变变量(mutable variables),转而采用高阶函数(能够接受函数作为参数或返回函数的函数)以及纯函数(在给定相同输入条件下,始终产生相同输出的函数)作为构建程序的基本构件。函数式编程强调使用纯函数。
特点:
1. 把计算视为函数的求值。强调数据的映射和转换。
2. 不允许状态变化。函数的输出仅由输入决定。
3. 鼓励不可变数据。数据一旦创建就不能更改。
4. 倡导高阶函数。函数可以作为参数或返回值。
Java函数式编程
Lambda
释义:
它允许将函数作为方法的参数或返回值,简化了代码,支持函数式编程,Lambda表达式的引入解决了匿名内部类代码冗余的问题,并支持并行编程。Lambda 表达式产生函数,而不是类。
基本语法:
(参数列表) -> {函数体}
方法引用:
由类名或者对象名,后面跟着 :: 然后跟方法名称
构造函数引用:ClassName::new
- 方法引用在很大程度上可以理解为创建一个函数式接口的实例
- 方法引用实际上是一种简化 Lambda 表达式的语法糖,它提供了一种更简洁的方式来创建一个函数式接口的实现
- 在代码中使用方法引用时,实际上是在创建一个匿名实现类,引用方法实现并且覆盖了接口的抽象方法
- 方法引用大多用于创建函数式接口的实现
使用场景:
Lambda表达式广泛应用于集合操作、线程创建、事件处理等场景。例如,在集合操作中,可以使用Lambda表达式来遍历集合并处理每个元素;在线程创建中,可以使用Lambda表达式来定义线程的行为;在事件处理中,可以将Lambda表达式作为事件处理函数的参数。
函数式接口
- 只包含一个抽象方法(Single Abstract Method,简称SAM)的接口,称为函数式接口。当然该接口可以包含其他非抽象方法。
- 你可以通过 Lambda 表达式来创建该接口的对象。(若 Lambda 表达式抛出一个受检异常(即:非运行时异常),那么该异常需要在目标接口的抽象方法上进行声明)。
- 我们可以在一个接口上使用 @FunctionalInterface 注解,这样做可以检查它是否是一个函数式接口。同时 javadoc 也会包含一条声明,说明这个接口是一个函数式接口。
- 在java.util.function包下定义了Java 8 的丰富的函数式接口
Java8使用示例:
public class Func {
/**
* 函数式接口:String转Integer
* 接受一个参数,返回一个结果
*/
private static Function<String,Integer> f1 = i-> Integer.valueOf(i);
/**
* 函数式接口:接受一个 int 参数,返回一个结果
*/
private static IntFunction<Integer> f2 = i->i*10;
private static LongFunction<String> f3 = l->String.valueOf(l);
private static ToIntFunction<Long> f5 = l->BigInteger.valueOf(l).intValue();
/**
* 函数式接口:无参,返回一个结果
*/
private static Supplier<Date> s = ()->new Date();
private static Comparator<Long> c = (l1,l2)->l1-l2>0?1:-1;
/**
* 接收一个参数,无返回值
*/
private static Consumer<Integer> cs = i->{
ConsumerInt ci = j-> System.out.println(j%2);
ci.remainder(i);
};
/**
* 接收一个参数,返回boolean值
*/
private static Predicate<Integer> p = Predicate1::taller;
public static void main(String[] args) {
Integer i = f1.apply("11");
System.out.println(i);
System.out.println(f2.apply(897));
System.out.println(f3.apply(3564735472l));
System.out.println(f5.applyAsInt(3564735472l));
System.out.println(s.get());
System.out.println(c.compare(789l,528l));
cs.accept(13);
System.out.println(p.test(179));
}
}
//方法引用定义
public class Predicate1 {
public static boolean taller(Integer height){
return height-180>0?true:false;
}
}
//函数式接口定义
public interface ConsumerInt {
void remainder(Integer u);
}