常见的四类函数式接口

Supplier 生产者, 返回一个指定类型的数据

 有且只有一个方法T get();不需要参数,返回指定T类型数据
package com.qfedu.c_supplier;import java.util.function.Supplier;/*** 利用函数式接口Supplier其中get方法,找出数组中最大值下标位置** @author Anonymous 2020/3/11 14:54*/
public class Demo2 {public static void main(String[] args) {int[] array = {1, 3, 5, 7, 9, 2, 4, 6, 8, 10};/*getMax方法需要的参数是一个Supplier函数式接口,这里可以使用Lambda表达式完成*/int max = getMax(() -> {int index = 0;for (int i = 1; i < array.length; i++) {if (array[index] < array[i]) {index = i;}}return index;});System.out.println(max);}/*** 利用函数式接口完成一个getMax,提供一个操作思想** @param sup Supplier函数式接口* @return 最大值下标位置*/public static int getMax(Supplier<Integer> sup) {return sup.get();}
}
package com.qfedu.c_supplier;import java.util.function.Supplier;/*** 演示Supplier函数式接口使用,对于方法的拓展能力和* 普适性满足** @author Anonymous 2020/3/11 15:06*/
public class Demo3 {public static void main(String[] args) {Integer[] array = {1, 3, 5, 7, 9, 2, 4, 6, 8, 10};Integer max = getMax(array, () -> {Integer temp = array[0];for (int i = 1; i < array.length; i++) {if (temp < array[i]) {temp = array[i];}}return temp;});System.out.println(max);System.out.println("-------------------------------------------");Person[] persons = {new Person(1, "骚磊", 16),new Person(2, "老黑", 66),new Person(3, "老付", 36),new Person(4, "老高", 26),new Person(5, "污云", 96),new Person(6, "帅栋", 106)};Person max1 = getMax(persons, () -> {Person p = persons[0];for (int i = 1; i < persons.length; i++) {if (p.getAge() < persons[i].getAge()) {p = persons[i];}}return p;});System.out.println(max1);}/*** 找出任意类型数组中最大数据** @param arr 任意类型数组,同时约束当前泛型的使用规则* @param sup Supplier函数式接口,要利用get方法,返回指定T类型数据* @param <T> 泛型* @return 和数组类型一致的数据*/public static <T> T getMax(T[] arr, Supplier<T> sup) {return sup.get();}
}

Consumer

操作使用的方式是
void accept(T t);根据接口指定的数据类型接收对应数据,进行处理和消费,对外没有任何的返回至于处理的过程,展示,处理,计算。。。
package com.qfedu.d_consumer;import java.util.function.Consumer;/*** 使用Consumer处理数据** @author Anonymous 2020/3/11 15:24*/
public class Demo1 {public static void main(String[] args) {// 该方法需要的参数是一个String类型,同时使用Consumer接口处理数据// 因为Consumer接口是一个函数式接口,可以使用Lambda表达式testConsumer("宫保鸡丁,番茄牛腩,酱牛肉,黄焖鸡米饭", (str) -> {String[] split = str.split(",");for (String s : split) {System.out.println(s);}});}/*** 给予当前方法一个String类型,通过Consumer函数式接口中的accept方法完成对应* 字符串处理** @param str String类型字符串* @param consumer Consumer处理数据的函数式接口*/public static void testConsumer(String str, Consumer<String> consumer) {consumer.accept(str);}
}
package com.qfedu.d_consumer;import java.util.function.Consumer;/*** Consumer接口andThen使用* 需要两个Consumer接口,两个Consumer接口进行组合处理,对数据进行消费** andThen(Consumer<T> con)*      调用格式*          con1.andThen(con2).accept(T t);*          等价于一下操作*          con1.accept(t);*          con2.accept(t);** @author Anonymous 2020/3/11 15:57*/
public class Demo2 {public static void main(String[] args) {/*该方法需要两个Consumer函数式接口,这里可以使用两个Lambda表达式操作*/testAndThen("郑州加油!!!中国加油!!!",(str) -> System.out.println(str),(str) -> System.err.println(str));}/*** 使用两个Consumer消费者方式处理str数据,首先是con1处理,再来con2处理** @param str  需要处理的String类型数据* @param con1 Consumer<String> 处理String类型函数式接口* @param con2 Consumer<String> 处理String类型函数式接口*/public static void testAndThen(String str, Consumer<String> con1, Consumer<String> con2) {/*con1.accept(str);con2.accept(str);允许组合拳con1.andThen(con2).andThen(con1).andThen(con2).andThen(con1).andThen(con2).accept(str);*/con1.andThen(con2).accept(str);}
}

Predicate一般用于调节判断,过滤数据的方法

函数式接口中指定的方法
boolean test(T t);处理T类型数据,返回boolean true / false
package com.qfedu.e_predicate;import java.util.function.Predicate;/*** 演示Predicate<T>基本使用*      boolean test(T t)** @author Anonymous 2020/3/11 16:11*/
public class Demo1 {public static void main(String[] args) {// Predicate函数式接口,使用Lambda表达式作为方法的参数boolean b = testPredicate("郑州奥力给!!!中国奥力给!!!",(str) -> {return str.contains("加油");});System.out.println("ret : " + b);System.out.println("---------------------------");/*优化Lambda表达式,因为是一个参数,小括号可以省略就一行代码,大括号可以省略return也可以省略*/testPredicate("郑州奥力给!!!中国奥力给!!!", str -> str.contains("加油"));}/*** 使用Predicate函数式接口利用boolean test(T t)对于当前数据进行判断操作,* 返回boolean类型数据** @param str 需要进行判断数据的String类型字符串* @param pre 处理使用Predicate函数式接口* @return 判断接口是否满足要求,满足返回true,不满足返回false*/public static boolean testPredicate(String str, Predicate<String> pre) {return pre.test(str);}
}
package com.qfedu.e_predicate;import java.util.function.Predicate;/*** Predicate and使用* default修饰方法add(Predicate<T> pre)*      and就是逻辑运算符里面的 &&*      同真为真,有假【即】假*      需要对两个Predicate进行判断处理**      例如:*          pre1.test(str) && pre2.test(srt);*          ==> pre1.and(pre2).test(str);** @author Anonymous 2020/3/11 16:19*/
public class Demo2 {public static void main(String[] args) {/*这里需要量Predicate接口,使用Lambda*/boolean ret = testAnd("赶紧复工吧,不要搞事情了!!!",str -> str.length() > 5,str -> str.startsWith("赶紧"));System.out.println(ret);}/*** 组合判断** @param str  需要判断的字符串* @param pre1 判断方式1* @param pre2 判断方式2* @return 处理结果 true, false*/public static boolean testAnd(String str, Predicate<String> pre1, Predicate<String> pre2) {// return pre1.test(str) && pre2.test(str)return pre1.and(pre2).test(str);}
}
package com.qfedu.e_predicate;import java.util.function.Predicate;/*** Predicate or演示** @author Anonymous 2020/3/11 16:32*/
public class Demo3 {public static void main(String[] args) {boolean ret = testOr("国家之强大,国外人羡慕不得~~",str -> str.length() < 10,str -> str.contains("国家"));System.out.println(ret);}/*** or 组合判断** @param str  需要判断的字符串* @param pre1 判断方式1* @param pre2 判断方式2* @return 处理结果 true, false*/public static boolean testOr(String str, Predicate<String> pre1, Predicate<String> pre2) {// return pre1.test(str) || pre2.test(str);return pre1.or(pre2).test(str);}
}
package com.qfedu.e_predicate;import java.util.function.Predicate;/*** Predicate negate()操作** @author Anonymous 2020/3/11 16:36*/
public class Demo4 {public static void main(String[] args) {boolean ret = testNegate("疫情总会过去的!!!",str -> str.length() < 5);System.out.println(ret);}/*** negate操作** @param str 字符串* @param pre Predicate函数式接口* @return 处理结果*/public static boolean testNegate(String str, Predicate<String> pre) {// return !pre.test(str);return pre.negate().test(str);}
}

ArrayList中使用Predicate删除指定数据

package com.qfedu.e_predicate;import com.qfedu.c_supplier.Person;import java.util.ArrayList;/*** ArrayList,使用Predicate作为条件约束删除对应的数据** @author Anonymous 2020/3/11 16:41*/
public class Demo5 {public static void main(String[] args) {ArrayList<Person> list = new ArrayList<>();list.add(new Person(1, "骚磊", 16));list.add(new Person(2, "老黑", 66));list.add(new Person(3, "老付", 36));list.add(new Person(4, "老高", 26));list.add(new Person(5, "污云", 96));list.add(new Person(6, "帅栋", 96));// 直接安排Predicate函数式接口来约束对应的条件,进行删除操作// 代码的阅读性,普适性提升// 以及代码的冗余程度降低list.removeIf(person -> person.getAge() > 40 && person.getId() > 3);System.out.println(list);}
}

Function<T,R> 类型转换

使用R apply(T t)
转换指定类型T到R

package com.qfedu.f_function;import com.qfedu.c_supplier.Person;import java.util.function.Function;/*** Function<T, R> 函数式接口*      R apply(T)** @author Anonymous 2020/3/11 16:50*/
public class Demo1 {public static void main(String[] args) {// Integer类型转换成一个StringString change = change(10, i -> i + "");System.out.println(change);// 利用函数式接口处理一个String类型,转换成对应的Person类型Person person1 = change("1,骚磊,16", str -> {String[] split = str.split(",");Person person = new Person();person.setId(Integer.parseInt(split[0]));person.setName(split[1]);person.setAge(Integer.parseInt(split[2]));return person;});System.out.println(person1);}/*** 转换格式的方法,要求数据从Integer类型转换到指定的String类型** @param i 需要转换的Integer类型* @param fun 转换使用的Function函数式接口* @return 返回值的是String类型*/public static String change(Integer i, Function<Integer, String> fun) {return fun.apply(i);}public static Person change(String str, Function<String, Person> fun) {return fun.apply(str);}
}
package com.qfedu.f_function;import java.util.function.Function;/*** Function<T, R>*     default修饰andThen方法使用** @author Anonymous 2020/3/11 17:01*/
public class Demo2 {public static void main(String[] args) {String s = testAndThen(10,i -> i + "",i -> i + "测试");System.out.println(s);}/*** 两次转换过程** @param i 需要处理的类型* @param fun1 Function函数接口* @param fun2 Function函数接口* @return String类型*/public static String testAndThen(int i, Function<Integer, String> fun1, Function<String, String> fun2) {// andThen使用,最后apply方法参数类型是fun1要求的转换参数类型return fun1.andThen(fun2).apply(i);}
}

常用的函数式接口FunctionInterface相关推荐

  1. 常用的函数式接口_Supplier接口

    常用函数式接口 JDK提供了大量常用的函数式接口以丰富Lambda的典型使用场景,它们主要在java.util.function 包中被提供. 下面是最简单的几个接口及使用示例. Supplier接口 ...

  2. 常用Lambda函数式接口

    常用Lambda函数式接口 1-概述 有且只有一个抽象方法,为Lambda准备的接口 都是由@FunctionalInterface进行的注解 2-函数式接口作为方法的参数 创建线程,用的最多且经典的 ...

  3. java socket接口文档_Java进阶 - 网络编程、Socket、函数式接口、常用的函数式接口...

    1.网络通信协议 网络通信协议:通信协议是对计算机必须遵守的规则,只有遵守这些规则,计算机之间才能进行通信.这就好比在道路中行驶的汽车一定要遵守交通规则一样,协议中对数据的传输格式.传输速率.传输步骤 ...

  4. 常用的函数式接口_Consumer接口

    Consumer接口 java.util.function.Consumer<T> 接口则正好与Supplier接口相反,它不是生产一个数据,而是消费一个数据,其数据类型由泛型决定. 抽象 ...

  5. 常用的函数式接口_Supplier接口练习_求数组元素最大值

    求数组元素最大值 题目 使用Supplier 接口作为方法参数类型,通过Lambda表达式求出int数组中的最大值.提示:接口的泛型请使用java.lang.Integer 类. 解答 package ...

  6. 常用的函数式接口--Consumer接口

    Consumer java.util.function.Consumer 接口刚好和Supplier接口相反,它不是用来生产一个数据,而是消费一个数据 数据的类型由泛型来指定 accept方法 意思就 ...

  7. 常用的函数式接口_Function接口练习_自定义函数模型拼接

    练习:自定义函数模型拼接 题目 请使用Function 进行函数模型的拼接,按照顺序需要执行的多个函数操作为: String str = "赵丽颖,20"; 1. 将字符串截取数字 ...

  8. 常用的函数式接口_Function接口_默认方法andThen

    默认方法:andThen Function 接口中有一个默认的andThen 方法,用来进行组合操作.JDK源代码如: default <V> Function<T, V> a ...

  9. 常用的函数式接口_Function接口

    Function接口 java.util.function.Function<T,R> 接口用来根据一个类型的数据得到另一个类型的数据,前者称为前置条件,后者称为后置条件. 抽象方法:ap ...

最新文章

  1. RESTful之视图集ViewSet
  2. GAN(Generative Adversarial Network,GAN)模型之:InfoGAN、WGAN、DCGAN模型
  3. C/C++控制台应用程序——画三角形、圆、直线、矩形
  4. 一个菜鸟程序员的游戏开发心得
  5. Oracle 协议适配器错误
  6. 恶意软件利用Windows故障诊断平台传播
  7. FGUI手势案例代码
  8. 总结了一份嵌入式硬件开发的具体流程
  9. 家用简单电线路图_6种简单电路图
  10. docker操作记录-5
  11. 象棋马走日步数计算流程图
  12. 养成这个好习惯,让播音主持成为你的加分项
  13. 对立志成为DBA的人的几点建议
  14. ios app 上传时 ERROR ITMS-90096
  15. 蓝牙耳机什么样式最舒服?推荐一款好用的蓝牙耳机
  16. 惠州学院计算机学院院长,惠州学院计算机科学与工程学院院领导一行来我院参观交流...
  17. 星巴克——starbuck
  18. python easygui该如何使用?
  19. java面试分为_【中软国际Java面试】面试分为两轮。-看准网
  20. COM组件 ATL的创建和调用

热门文章

  1. pip install速度很慢怎么办
  2. Linux 详解权限
  3. 致那些我工作过的设备
  4. 形容吃苦耐劳不怕困难的名人名言
  5. 2020CVPR VSR Space-Time-Aware Multi-Resolution Video Enhancement
  6. 如何用纯 CSS 创作一个沙漏 loader
  7. oracle包校验和失败怎么回事,lol更新包md5校验失败怎么回事_更新lol提示更新包MD5校验失败如何处理-win7之家...
  8. IOS获取系统相簿里的照片
  9. ios照片获取、拍照功能
  10. Android动态识别字符编码