IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 开发测试 -> 函数式接口 -> 正文阅读

[开发测试]函数式接口

函数式接口(Functional Interface)是Java 8对一类特殊类型的接口的称呼。 这类接口只定义了唯一的抽象方法的接口,并且这类接口使用了@FunctionalInterface进行注解。在jdk8中,引入了一个新的包java.util.function, 可以使java 8 的函数式编程变得更加简便。这个package中的接口大致分为了以下四类:

  • Function: 接收参数,并返回结果,主要方法 R apply(T t)

  • Consumer: 接收参数,无返回结果, 主要方法为 void accept(T t)

  • Supplier: 不接收参数,但返回结构,主要方法为 T get()

  • Predicate: 接收参数,返回boolean值,主要方法为 boolean test(T t)

<img src="https://segmentfault.com/img/bVbhNvl/view" alt="preview" style="zoom:80%;" />

接口方法

Function方法

接收单个参数

Interfacefunctional method说明
Function<T,R>R apply(T t)接收参数类型为T,返回参数类型为R
IntFunction<R>R apply(int value)以下三个接口,指定了接收参数类型,返回参数类型为泛型R
LongFunction<R>R apply(long value)
Double<R>R apply(double value)
ToIntFunction<T>int applyAsInt(T value)以下三个接口,指定了返回参数类型,接收参数类型为泛型T
ToLongFunction<T>long applyAsLong(T value)
ToDoubleFunction<T>double applyAsDouble(T value)
IntToLongFunctionlong applyAsLong(int value)以下六个接口,既指定了接收参数类型,也指定了返回参数类型
IntToDoubleFunctiondouble applyAsLong(int value)
LongToIntFunctionint applyAsLong(long value)
LongToDoubleFunctiondouble applyAsLong(long value)
DoubleToIntFunctionint applyAsLong(double value)
DoubleToLongFunctionlong applyAsLong(double value)
UnaryOperator<T>T apply(T t)特殊的Function,接收参数类型和返回参数类型一样
IntUnaryOperatorint applyAsInt(int left, int right)以下三个接口,指定了接收参数和返回参数类型,并且都一样
LongUnaryOperatorlong applyAsInt(long left, long right)
DoubleUnaryOperatordouble applyAsInt(double left, double right)

接收两个参数

interfacefunctional method说明
BiFunction<T,U,R>R apply(T t, U u)接收两个参数的Function
ToIntBiFunction<T,U>int applyAsInt(T t, U u)以下三个接口,指定了返回参数类型,接收参数类型分别为泛型T, U
ToLongBiFunction<T,U>long applyAsLong(T t, U u)
ToDoubleBiFunction<T,U>double appleyAsDouble(T t, U u)
BinaryOperator<T>T apply(T t, T u)特殊的BiFunction, 接收参数和返回参数类型一样
IntBinaryOperatorint applyAsInt(int left, int right)
LongBinaryOperatorlong applyAsInt(long left, long right)
DoubleBinaryOperatordouble applyAsInt(double left, double right)

Consumer方法

接收一个参数

interfacefunctional method说明
Consumer<T>void accept(T t)接收一个泛型参数,无返回值
IntConsumervoid accept(int value)以下三个类,接收一个指定类型的参数
LongConsumervoid accept(long value)
DoubleConsumervoid accept(double value)

接收两个参数

interfacefunctional method说明
BiConsumer<T,U>void accept(T t, U u)接收两个泛型参数
ObjIntConsumer<T>void accept(T t, int value)以下三个类,接收一个泛型参数,一个指定类型的参数
ObjLongConsumer<T>void accept(T t, long value)
ObjDoubleConsumer<T>void accept(T t, double value)

Supplier方法

interfacefunctional method说明
Supplier<T>T get()返回类型为泛型T
BooleanSupplierboolean getAsBoolean()以下三个接口,返回指定类型
IntSupplierint getAsInt()
LongSupplierlong getAsLong()
DoubleSupplierdouble getAsDouble()

Predicate方法

根据接收参数进行断言,返回boolean类型

interfacefunctional method说明
Predicate<T>boolean test(T t)接收一个泛型参数
IntPredicateboolean test(int value)以下三个接口,接收指定类型的参数
LongPredicateboolean test(long value)
DoublePredicateboolean test(double value)
BiPredicate<T,U>boolean test(T t, U u)接收两个泛型参数,分别为T,U

实现函数式接口的三种方法

编写实现类

?public class MyFunction implements Function <Integer, Integer>{
? ? ?@Override
? ? ?public Integer apply(Integer integer) {
? ? ? ? ?return null;
? ?  }
?}

匿名内部类

new Function<Integer, Integer>() {
? ? ?@Override
? ? ?public Integer apply(Integer integer) {
? ? ? ? ?return null;
? ?  }
?};

lambda表达式

IntFunction<Integer> integerIntFunction = (int a) -> {
? ? ?return a;
?};

lambda表达式就是为了优化匿名内部类而生

Function功能型函数式接口

Function接口 接受一个输入参数T,返回一个结果R

@FunctionalInterface
?public interface Function<T, R> {
??
? ? ?// 接受输入参数,对输入执行所需操作后  返回一个结果
? ? ?R apply(T t);
??
? ? ?// 返回一个 先执行before函数对象apply方法,再执行当前函数对象apply方法的 函数对象。
? ? ?default <V> Function<V, R> compose(Function<? super V, ? extends T> before) {
? ? ? ? ?Objects.requireNonNull(before);
? ? ? ? ?return (V v) -> apply(before.apply(v));
? ?  }
??
? ? // 返回一个 先执行当前函数对象apply方法, 再执行after函数对象apply方法的 函数对象。
? ? ?default <V> Function<T, V> andThen(Function<? super R, ? extends V> after) {
? ? ? ? ?Objects.requireNonNull(after);
? ? ? ? ?return (T t) -> after.apply(apply(t));
? ?  }
??
?    // 返回一个执行了apply()方法之后只会返回输入参数的函数对象。
? ? ?static <T> Function<T, T> identity() {
? ? ? ? ?return t -> t;
? ?  }
?// lambda表达式
?IntFunction<Integer> integerIntFunction = (int a) -> a+10;
??
?// 匿名内部类
?IntFunction<Integer> intFunction = new IntFunction<Integer>() {
? ? ?@Override
? ? ?public Integer apply(int value) {
? ? ? ? ?return value + 20;
? ?  }
?};
?System.out.println(integerIntFunction.apply(10)); // 20
?System.out.println(intFunction.apply(10)); // 30
?// andThen方法使用
?public static Integer andThenTest(int value, Function<Integer, Integer> f1, Function<Integer, Integer> f2){
? ? ?return f1.andThen(f2).apply(value);
?}
??
?public static void main(String[] args) {
? ? ?System.out.println(andThenTest(10, val -> val + 10, val -> val + 20)); // 40
?}

Consumer消费型函数式接口

代表了 接受一个输入参数并且无返回的操作

?@FunctionalInterface
?public interface Consumer<T> {
? ? ?
? ? ?void accept(T t);
??
? ? ?// 代表一个组合函数,先执行当前函数,再执行after函数,如果执行当前函数抛出异常,不会执行after函数,如果执行after函数抛出异常,则异常会传递给调用者
? ? ?default Consumer<T> andThen(Consumer<? super T> after) {
? ? ? ? ?Objects.requireNonNull(after);
? ? ? ? ?return (T t) -> { accept(t); after.accept(t); };
? ?  }
?}
Consumer<String> consumer = s -> System.out.println(s + "  consumer test");
??
?Consumer<String> consumer = new Consumer<String>() {
? ? ?@Override
? ? ?public void accept(String s) {
? ? ? ? ?System.out.println(s + "  consumer test");
? ?  }
?};
?consumer.accept("one"); // one  consumer test

Supplier供给型函数式接口

无参数,返回一个结果

?@FunctionalInterface
?public interface Supplier<T> {
? ? ?T get();
?}
?Supplier<String> supplier = () -> "supplier test msg";
??
?Supplier<String> supplier = new Supplier<String>() {
? ? ?@Override
? ? ?public String get() {
? ? ? ? ?return "supplier test msg";
? ?  }
?};
??
?System.out.println(supplier.get()); // supplier test msg
?System.out.println(supplier.get()); // supplier test msg

Predicate断言型函数式接口

接受一个输入参数,返回一个布尔值结果

?@FunctionalInterface
?public interface Predicate<T> {
??
? ? ?// 通过test方法进行判断,如果成功,返回true,如果失败返回false
? ? ?boolean test(T t);
??
? ? ?// 组合函数,相当于短路&& 
? ? ?default Predicate<T> and(Predicate<? super T> other) {
? ? ? ? ?Objects.requireNonNull(other);
? ? ? ? ?return (t) -> test(t) && other.test(t);
? ?  }
??
? ? ?// 相当于非操作
? ? ?default Predicate<T> negate() {
? ? ? ? ?return (t) -> !test(t);
? ?  }
??
? ? ? // 相当于 || 操作,同样短路
? ? ?default Predicate<T> or(Predicate<? super T> other) {
? ? ? ? ?Objects.requireNonNull(other);
? ? ? ? ?return (t) -> test(t) || other.test(t);
? ?  }
??
? ? ?// 通过Objects的equals判断两个对象是否equals
? ? ?static <T> Predicate<T> isEqual(Object targetRef) {
? ? ? ? ?return (null == targetRef)
? ? ? ? ? ? ? ? ?? Objects::isNull
? ? ? ? ? ? ? ?  : object -> targetRef.equals(object);
? ?  }
?}
Predicate<Integer> predicate = integer -> integer == 3;
??
?Predicate<Integer> predicate = new Predicate<Integer>() {
? ? ?@Override
? ? ?public boolean test(Integer integer) {
? ? ? ? ?return integer == 3;
? ?  }
?};
??
?System.out.println(predicate.test(3)); // true
?System.out.println(predicate.test(4)); // false
?public static void eval(List<Integer> list, Predicate<Integer> predicate) {
? ? ? ? ?for (Integer n : list) {
? ? ? ? ? ? ?if (predicate.test(n)) {
? ? ? ? ? ? ? ? ?System.out.print(n + " ");
? ? ? ? ? ?  }
? ? ? ?  }
? ?  }
??
? ? ?public static void main(String args[]) {
? ? ? ? ?List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9);
??
? ? ? ? ?// Predicate<Integer> predicate = n -> true
? ? ? ? ?// n 是一个参数传递到 Predicate 接口的 test 方法
? ? ? ? ?// n 如果存在则 test 方法返回 true
? ? ? ? ?System.out.println("输出所有数据:");
??
? ? ? ? ?// 传递参数 n
? ? ? ? ?eval(list, n -> true);
??
? ? ? ? ?// Predicate<Integer> predicate1 = n -> n%2 == 0
? ? ? ? ?// n 是一个参数传递到 Predicate 接口的 test 方法
? ? ? ? ?// 如果 n%2 为 0 test 方法返回 true
??
? ? ? ? ?System.out.println("\n输出所有偶数:");
? ? ? ? ?eval(list, n -> n % 2 == 0);
??
? ? ? ? ?// Predicate<Integer> predicate2 = n -> n > 3
? ? ? ? ?// n 是一个参数传递到 Predicate 接口的 test 方法
? ? ? ? ?// 如果 n 大于 3 test 方法返回 true
??
? ? ? ? ?System.out.println("\n输出大于 3 的所有数字:");
? ? ? ? ?eval(list, n -> n > 3);
? ?  }
?输出所有数据:
?1 2 3 4 5 6 7 8 9 
?输出所有偶数:
?2 4 6 8 
?输出大于 3 的所有数字:
?4 5 6 7 8 9 
?//需求:使用Predicat接口作为方法的参数,实现对一个字符的长度进行判断
?public static boolean checkStr(String s, Predicate<String> predicate){
? ? ?return predicate.test(s);
?}
??
?public static void main(String[] args) {
? ? ?boolean result = checkStr("zha", (str) -> {
? ? ? ? ?return str.length() > 5;
? ?  });
? ? ?System.out.println(result);
?}
?//需求:判断一个字符串的长度是否大于5,并且判断该字符串中是否包含a
?/*分析:1.与 操作,可以使用&& 或使用and()方法去实现
? ? ? ? ? ? 2.我们可以传递两个Predicate类型的参数,
? ? ? ? ? ? ?第一个参数用来判断字符串的长度是否大于5
? ? ? ? ? ? ?第一个参数用来判断该字符串中是否包含a
? ? ?*/
?public static boolean checkString(String s,
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?Predicate<String> predicate1,
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?Predicate<String> predicate2){
? ? ?//predicate1.test(s)&&predicate2.test(s);
? ? ?return predicate1.and(predicate2).test(s);
?}
?public static void main(String[] args) {
? ? ?boolean b = checkString("zha",(s)->{
? ? ? ? ?return s.length()>5;
? ?  },(s)->{
? ? ? ? ?int i = s.indexOf("a");
? ? ? ? ?if(i>0){
? ? ? ? ? ? ?return true;
? ? ? ?  }else{
? ? ? ? ? ? ?return false;
? ? ? ?  }
? ?  });
? ? ?System.out.println(b);
?}

  开发测试 最新文章
pytest系列——allure之生成测试报告(Wind
某大厂软件测试岗一面笔试题+二面问答题面试
iperf 学习笔记
关于Python中使用selenium八大定位方法
【软件测试】为什么提升不了?8年测试总结再
软件测试复习
PHP笔记-Smarty模板引擎的使用
C++Test使用入门
【Java】单元测试
Net core 3.x 获取客户端地址
上一篇文章      下一篇文章      查看所有文章
加:2021-12-14 16:15:41  更:2021-12-14 16:16:36 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/18 7:40:59-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码