函数时编程——Predicate|Consumer|Function|Supplier

164 阅读2分钟

这是我参与11月更文挑战的第14天,活动详情查看:2021最后一次更文挑战

四位大哥都隶属于java.util.function包下,Consumer(消费型),Supplier(供给型)、Predicate(判断型)与Function<T,R>(转换型),UnaryOperator一元函数,BiFunction<T,U,R>两个输入函数,BinaryOperator二元函数。

具体如下:

1ded07b994ab0177dcbde3fd1d99b3b.png

函数式接口只有一个方法的接口:

@FunctionalInterface
interface Interface2{
    String format(int money);
}

一、 Consumer接口——消费型接口

consumer接口就是一个消费型的接口,通过传入参数,然后操作处理,没有返回。

T:入参类型;没有出参

调用方法:void accept(T t);

常用于打印、发送短信等消费动作

示例:

Consumer<String> consumer= p -> System.***out***.println(p)


Consumer<String> consumer = s-> System.out.println(s);
Consumer<String> consumers = s-> System.out.println(s=s.toUpperCase());
consumer.accept("8999willson.zou");
consumer.andThen(consumers).accept("22228999willson.zou");

调用函数:consumer.accept("xxx");

Consumer总结:

Consumer接口是一个消费型的接口,只要实现它的accept方法,就能作为消费者来输出信息。 lambda、方法引用都可以是一个Consumer类型,因此他们可以作为forEach的参数,用来协助Stream输出信息。 Consumer还有很多变种,例如IntConsumer、DoubleConsumer与LongConsumer等,归根结底,这些变种其实只是指定了Consumer中的泛型而已,方法上并无变化。

二、 Supplier接口——供给型接口

T:出参类型;没有入参

调用方法:T get();

常用于业务“有条件运行”时,符合条件再调用获取结果的应用场景;创建无参构造函数。

示例: Supplier supplier= () -> 100;   

//构造函数的方法引用
Supplier<Dog> dogSupplier = Dog::new;
System.out.println(dogSupplier.get());

Supplier总结:

  • Supplier是一个供给型的接口,其中的get方法用于返回一个值。
  • Supplier也有很多的变种,例如IntSupplier 、DoubleSupplier 、LongSupplier 、BooleanSupplier等

三、Predicate接口——判断型接口

T:入参类型;出参类型是Boolean

调用方法:boolean test(T t);

示例:Predicate predicate = p -> p % 2 == 0; // 判断是否、是不是偶数

predicate.test(100); // 运行结果true

Predicate总结:

  • Predicate 是一个谓词型接口,其实只是起到一个判断作用。\
  • Predicate 通过实现一个 test 方法做判断。

四、 Function接口——功能型接口

Function是一个功能型的接口,用于将一种类型的数据转化为另外一种类型的数据。

T:入参类型,R:出参类型

调用方法:R apply(T t); 

示例:Function<Integer, String> func = p -> String.value(p * 10);    // 输出入参的10倍

调用函数示例:func.apply(10); 

Function总结:

  • Function是一个转换型的接口,其中的apply可以将一种类型的数据转化成另外一种类型的数据。
  • Function的变种IntFunction 、DoubleFunction 、LongFunction 、ToIntFunction 、ToDoubleFunction 、DoubleToIntFunction 等。