【Java进阶】常用函数式接口的使用方法

2023-10-22 19:54:03 浏览数 (2)

随着Lambda的出现,JDK1.8引入了java.util.function包,这个包中包含了一系列的函数式接口,这些接口用于支持Lambda表达式和方法引用。

java.util.function包下主要有四个常用的接口,分别是ConsumerSupplierPredicateFunction

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(),该接口用于返回一个结果,并且不接受任何参数。

代码语言:javascript复制
Optional<String> optional = Optional.empty();
Supplier<String> supplier = () -> UUID.randomUUID().toString();
System.out.println(optional.orElseGet(supplier));

以上是Supplier接口的经典使用,与Optional配合使用,Optional.empty()返回一个空值的Optionaloptional.orElseGet用于返回一个值,判断Optional是否为空值,如果是空值就通过Supplier接口返回一个值。

Predicate接口

Predicate是一个判断接口,主要用来判断传入的参数是否符合先前设置的条件,返回布尔值,它有1个抽象方法 、4个默认方法以及1一个静态方法。静态方法很好理解使用也较少,所以这里不对静态方法示例。

test方法

下面是boolean test(T t)方法的基本用法:

代码语言:javascript复制
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)方法是接口中的一个默认方法,表示并且含义,也就是进行多次判断是否符合条件。

代码语言:javascript复制
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方法用法相似,表示或者,多个条件中满足一个即可。这里将上面的示例改写一下:

代码语言:javascript复制
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方法用法相似,表示,即取反。这里还是将上面的示例改写一下:

代码语言:javascript复制
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才能发挥它的作用。

代码语言:javascript复制
Function<String, Integer> strToInt = e -> Integer.parseInt(e);
System.out.println(
        strToInt.apply("123").getClass().getName()
);

以上示例输出结果为:java.lang.Integer。通过strToInt将字符串"123"转为Integer输出。

composeandThen方法

compose(Function before)方法传入一个Function ,并且返回一个新的Function 它先执行 before 函数对象的 apply 方法,然后将结果传递给当前函数对象的 apply 方法。

代码语言:javascript复制
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。通过将function2function1像结合,先执行function1再将结果传递给function2再次计算并输出。

andThen方法与compose用法可以说是一摸一样,与compose不同的是先执行当前函数对象的 apply 方法。

0 人点赞