随着Lambda的出现,JDK1.8引入了java.util.function包,这个包中包含了一系列的函数式接口,这些接口用于支持Lambda表达式和方法引用。
java.util.function包下主要有四个常用的接口,分别是Consumer、Supplier、Predicate与Function。
Consumer接口
代码语言:javascript复制public void consumerFunction(){
Consumer<String> consumer = System.out::println;
consumer.accept("测试");
}以上是java.util.function.Consumer的简单使用。它用于接受一个输入参数并执行操作,但不会返回任何结果。
Supplier接口
代码语言:javascript复制public void supplierFunction() {
Supplier<String> supplier = () -> UUID.randomUUID().toString();
System.out.println(supplier.get());
}以上是java.util.function.Supplier的简单使用。Supplier 接口只有一个抽象方法 T get(),该接口用于返回一个结果,并且不接受任何参数。
Optional<String> optional = Optional.empty();
Supplier<String> supplier = () -> UUID.randomUUID().toString();
System.out.println(optional.orElseGet(supplier));以上是Supplier接口的经典使用,与Optional配合使用,Optional.empty()返回一个空值的Optional,optional.orElseGet用于返回一个值,判断Optional是否为空值,如果是空值就通过Supplier接口返回一个值。
Predicate接口
Predicate是一个判断接口,主要用来判断传入的参数是否符合先前设置的条件,返回布尔值,它有1个抽象方法 、4个默认方法以及1一个静态方法。静态方法很好理解使用也较少,所以这里不对静态方法示例。
test方法
下面是boolean test(T t)方法的基本用法:
Predicate<Integer> predicate = i -> i > 0;
System.out.println(predicate.test(10));以上代码通过Lambda表达式来创建一个Predicate对象,代码中Predicate被定义为接收一个整数参数并检查它是否大于0。当调用predicate.test(10)时,它会检查10是否大于0,因此返回值为true。
and方法
Predicate<T> and(Predicate<? super T> other)方法是接口中的一个默认方法,表示并且含义,也就是进行多次判断是否符合条件。
List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
Predicate<Integer> predicate1 = i -> i > 2; // 条件1
Predicate<Integer> predicate2 = i -> i < 6; // 条件2
List<Integer> collect = list.stream().filter(
predicate1.and(predicate2)
).collect(Collectors.toList());以上示例中collect输出结果为:[3, 4, 5]。示例中对集合list进行过滤出符合条件1并且同时符合条件2的元素。
or方法
与and方法用法相似,表示或者,多个条件中满足一个即可。这里将上面的示例改写一下:
List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
Predicate<Integer> predicate1 = i -> i < 2; // 条件1
Predicate<Integer> predicate2 = i -> i > 8; // 条件2
List<Integer> collect = list.stream().filter(
predicate1.or(predicate2)
).collect(Collectors.toList());以上示例中collect输出结果为:[1, 9, 10]。示例中对集合list进行过滤出符合条件1或者符合条件2的元素。
negate方法
与and方法用法相似,表示非,即取反。这里还是将上面的示例改写一下:
List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
Predicate<Integer> predicate1 = i -> i < 2; // 条件1
Predicate<Integer> predicate2 = i -> i > 8; // 条件2
List<Integer> collect = list.stream().filter(
predicate1.or(predicate2).negate() // 只加了negate()
).collect(Collectors.toList());以上示例中collect输出结果为:[2, 3, 4, 5, 6, 7, 8]。将符合条件的元素反选输出。
Function接口
java.util.function.Function是一个功能型接口,用于将参数根据预定规则处理并输出。该接口有1个抽象方法和2两个默认方法,以及1个静态方法。
apply方法
R apply(T t)方法就像是Function接口的启动器,调用了apply才能发挥它的作用。
Function<String, Integer> strToInt = e -> Integer.parseInt(e);
System.out.println(
strToInt.apply("123").getClass().getName()
);以上示例输出结果为:java.lang.Integer。通过strToInt将字符串"123"转为Integer输出。
compose与andThen方法
compose(Function before)方法传入一个Function ,并且返回一个新的Function 它先执行 before 函数对象的 apply 方法,然后将结果传递给当前函数对象的 apply 方法。
Function<String, Integer> function1 = e -> Integer.parseInt(e) 1;
Function<Integer, String> function2 = Object::toString;
Function<String, String> function3 = function2.compose(function1);
System.out.println(
function3.apply("1")
);以上示例输出结果为:2。通过将function2和function1像结合,先执行function1再将结果传递给function2再次计算并输出。
andThen方法与compose用法可以说是一摸一样,与compose不同的是先执行当前函数对象的 apply 方法。


