随着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
方法。