目录
- 面向对象思想主要是关注对象能完成什么事情,函数式编程思想就像函数式,主要是针对数据操作;
- 函数式接口的使用:一般可以作为 方法的参数 和 返回值类型
一.函数式接口作为方法的参数
@FunctionalInterface
public interface Runnable {
public abstract void run();
}
二.函数式接口作为方法的返回值
三.常用的函数式接口
JDK提供了大量常用的函数式接口以丰富Lambda的典型使用场景,它们主要在java.util.function包中被提供。下面是最简单的几个接口及使用示例。
3.1生产型Supplier接口
java.util.function.Supplier<T>接口仅包含一个无参的方法:T get()。用来获取一个泛型参数指定类型的对象数据。由于这是一个函数式接口,也就意味着对应的Lambda表达式需要"对外提供"一个符合泛型类型的对象数据。
3.2消费型Consumer接口
java.util.function.Consumer<T>接口则正好与Supplier接口相反,它不是生产一个数据,而是消费一个数据,其数据类型由泛型决定。
抽象方法:accept
Consumer接口中包含抽象方法 void accept(T t),意为消费一个指定泛型的数据。 基本使用如:
实际上就是重写了 void accept(T t); 方法
默认方法:andThen
如果一个方法的参数和返回值全部都是 Consumer 类型,那么就可以实现效果:消费数据的时候,首先做一个操作,然后再做一个操作,实现组合。而这个方法就是Consumer接口中的default方法andThen。下面是JDK的源代码:
default Consumer<T> andThen(Consumer<? super T> after) {
Objects.requireNonNull(after);//为null抛出异常
return (T t) -> { accept(t); after.accept(t); };
}
要想实现组合,需要两个或多个Lambda表达式即可,而andThen的语义是"一步接一步"操作。
3.3判断型Predicate接口
有时候我们需要对某种类型的数据进行判断,从而得到一个boolean值的结果。这时可以使用java.util.function.Predicate<T>接口。
抽象方法:test
Predicate接口中包含一个抽象方法:boolean test(T t)。用于条件判断的场景:
默认方法:and
既然是条件判断,就会存在与、或、非三种常见的逻辑关系。其中将两个 predicate 条件使用“与”逻辑连接起来实现“并且”的效果时,可以使用default方法and 。其JDK源码为
default Predicate<T> and(Predicate<? super T> other) {
Objects.requireNonNull(other);
return (t) -> test(t) && other.test(t);
}
如果要判断一个字符串既要包含大写“H”,又要包含大写“W”,那么:
Predicate接口还有两个默认方法:or(或) 、negate(取反)与上面的类似
3.4转换型接口Function
java.util.function.Function<T,R>接囗用来根据一个类型的数据得到另一个类型的数据,前者称为前置条件,后者称为后置条件。
抽象方法:apply
Function 接口中最主要的抽象方法为:R apply(T t),根据类型T的参数获取类型R的结果。
使用的场景例如:将 string 类型转换为 Integer 类型。
Function接口还有几个默认方法,感兴趣的可以去了解一下