文章目录
- 函数式接口
- 函数式接口当做方法的参数
- 函数式接口作为返回值
- 生产者接口 - Supplier
- 消费者接口 - Consumer
- 使用方式:
- 案例:字符串拆分
- 判断接口 - Predicate
- 使用方式
- 应用场景
- 加工接口 - Function
函数式接口
只有一个抽象方法的接口,转为lambda而生的接口
接口带有==@FunctionalInterface==
函数式接口当做方法的参数
案例:通过Runnable创建线程,把Runnable接口当做参数进行传递
package com.itxs.demo08;/*** @Classname : demo01* @Description : TODO 函数式接口当做参数进行传递* @Author : lin_refuel@qq.com*/
public class demo01 {public static void main(String[] args) {// 案例:创建线程// 方式一:匿名内部类的形式MyThread(new Runnable() {@Overridepublic void run() {System.out.println("我是匿名内部类的方式创建的线程");}});// 方式二:完整的lambdaMyThread(()->{System.out.println("完整的lambda创建的线程");});// 省略的lambdaMyThread(()-> System.out.println("省略的lambda创建的线程"));}private static void MyThread(Runnable r){new Thread(r).start();}
}
运行结果:
函数式接口作为返回值
案例:字符串长度比较进行排序
package com.itxs.demo08;import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;/*** @Classname : demo02* @Description : TODO 字符串的长度进行比较* @Author : lin_refuel@qq.com*/
public class demo02 {public static void main(String[] args) {// 定义一个String类型集合ArrayList<String> list = new ArrayList<>();// 添加元素list.add("123456555557");list.add("1234568");list.add("123456789");list.add("56789");//调用方法Collections.sort(list);// 自然规则进行排序for (String s : list) {System.out.println(s);}System.out.println("========================");Collections.sort(list,getCompare());// getCompare返回设置的比较器// 遍历集合for (String a:list) {System.out.println(a);}}/*** 设置比较器的排序规则* @return 返回一个Comparator接口*/private static Comparator<String> getCompare() {// 匿名内部类的方式
// return new Comparator<String>() {
// @Override
// public int compare(String o1, String o2) {
// return o1.length() - o2.length(); // 根据字符串长度进行比较 短的在前面
// }
// };// 通过lambda的方式return (o1,o2)->o1.length() - o2.length();// 引用方式// return Comparator.comparingInt(String::length);}
}
运行结果:
生产者接口 - Supplier
Supplier
是一个生产者接口,用来生产数据,通常返回的是一个数据(可以使用Lambda表达式)
通过Supplier返回一个字符串和找到数组中的最大值
package com.itxs.demo08;import java.util.function.Supplier;/*** @Classname : demo01* @Description : TODO supplier生产者接口* @Author : lin_refuel@qq.com*/
public class demo01 {public static void main(String[] args) {// 生产一个数据// 匿名内部类重写
// String str = getString(new Supplier<String>() {
// @Override
// public String get() {
// return "我是字符串";
// }
// });// lambda形式
// String str = getString(()->{
// return "我是一个字符串";
// });// lambda省略方式String str = getString(()->"我是字符串".substring(2,4));System.out.println(str);//======================================================// 定义一个数组找到数组中的最大值int[] array = {1,2,3,4,5,6,7,8,9,10};int max = getMax(()->{int Max = array[0];for (int i = 1; i < array.length; i++) {if(Max < array[i])Max = array[i];}return Max;});System.out.println("最大值Max = " + max);}/*** 找出最大值* @param sp Supplier接口,重写并调用里面抽象方法get* @return 最大值*/private static Integer getMax(Supplier<Integer> sp) {return sp.get();}/*** 字符串返回* @param sp Supplier接口,重写并调用里面抽象方法get* @return 字符串*/public static String getString(Supplier<String> sp) {return sp.get();}
}
运行结果:
消费者接口 - Consumer
是一个消费者接口,针对于数据做一些提取的操作,不需要返回值
使用方式:
demo: 对字符串进行操作
package com.itxs.demo08;import java.util.function.Consumer;/*** @Classname : demo02* @Description : TODO* @Author : lin_refuel@qq.com*/
public class demo02 {public static void main(String[] args) {// 匿名内部类consumptionCharacters("小肆", new Consumer<String>() {@Overridepublic void accept(String s) {System.out.println("你的名字是: " + s);}});// lambda方式consumptionCharacters("小三",(str)->{System.out.println("你的名字反过来是:" + new StringBuilder(str).reverse());});//=======================================================================// Consumer连续消费,例如操作同一个字符串consumer02("小三",(str)-> System.out.println(str),(str)-> System.out.println(new StringBuilder(str).reverse()));}private static void consumptionCharacters(String str, Consumer<String> con){con.accept(str);}private static void consumer02(String str,Consumer<String> con01,Consumer<String> con02){// con01.accept(str);//01//con02.accept(str);//02con01.andThen(con02).accept(str);// 这行代码==上面的01和02缩写}
}
运行结果:
案例:字符串拆分
package com.itxs.demo08;import java.util.function.Consumer;/*** @Classname : demo03* @Description : TODO Consumer - 应用场景* @Author : lin_refuel@qq.com*/
public class demo03 {public static void main(String[] args) {// 定义一个数组String[] name = {"东邪:黄固","西毒:欧阳锋","南帝:段智兴","北丐:洪七公","中神通:王重阳"};// 通过Consumer接口使其分开separate(name,(info)->{// info.split(":")[0]; 相当于是把字符串拆分成了字符数组,取下标为0的String outerNumber = info.split(":")[0];System.out.println("绰号:" + outerNumber);},(info)->{String originalName = info.split(":")[1];System.out.println("真名:" + originalName);});}private static void separate(String[] info, Consumer<String> con01,Consumer<String> con02){for (String s : info) {// 两个接口对同一个数组进行操作con01.andThen(con02).accept(s);System.out.println("=========================");}}
}
判断接口 - Predicate
使用方式
通常用于判断参数是否满足指定的条件
demo: 判断参数字符串的长度是否满足条件
package com.itxs.demo08;import com.sun.xml.internal.ws.api.model.wsdl.WSDLOutput;import java.util.function.Predicate;/*** @Classname : demo04* @Description : TODO 判断接口 -Predicate<>()* @Author : lin_refuel@qq.com*/
public class demo04 {public static void main(String[] args) {// Predicate接口的使用方式boolean b01 = res("JavaSE Linux MySQL redis", (str) -> {return str.length() > 10;// 判断字符串的长度是否超过10});System.out.println(b01); // 输出返回值System.out.println("===================================");boolean b02 = res("JavaSE Linux MySQL redis",str -> str.length()>20, // 字符串的长度是否超过20str -> str.length() < 30); // 字符串的长度是小于30System.out.println(b02);}/*** 根据字符串的是否符合要求来进行返回* @param str 目标字符串* @param p01 判断接口* @return 一个true or false*/private static boolean res(String str,Predicate<String> p01){//return p01.test(str); // true// !return p01.test(str);// 逻辑非return p01.negate().test(str); // 等于上一个行}/*** 多重判断条件* @param str 目标字符串* @param p01 判断条件接口1* @param p02 判断条件接口2* @return false or true*/private static boolean res(String str,Predicate<String> p01,Predicate<String> p02){//return p01.test(str) && p02.test(str);return p01.and(p02).test(str); // 逻辑与 等同于上面一行}
}
运行结果:
应用场景
筛选数据 - 找出年龄超过40的,名字是三个字的
package com.itxs.demo08;import java.util.ArrayList;
import java.util.function.Predicate;/*** @Classname : demo05* @Description : TODO Predicate - 应用场景 (筛选数据)* @Author : lin_refuel@qq.com*/
public class demo05 {public static void main(String[] args) {// 定义一个字符串数组 , 中原五绝的姓名和年龄String[] name = {"黄固,29","欧阳锋,31","段智兴,35","洪七公,43","王重阳,46"};// 找出名字长度为3 年龄超过40的ArrayList<String> res01 = res(name, (s) -> {return s.split(",")[0].length() == 3;// 判断分离的字符串长度是否为3}, (s) -> {return Integer.parseInt(s.split(",")[1]) > 40;});System.out.println(res01);}private static ArrayList<String> res(String[] name, Predicate<String> p01,Predicate<String> p02){ArrayList<String> list = new ArrayList<>();// 一个空的集合for (String s : name) {if(p01.and(p02).test(s)){list.add(s); // 满足条件进行添加}}return list;// 返回集合}
运行结果:
加工接口 - Function
接收一个参数,并产生一个结果
Function<T,R>
:接口通常用于对参数进行处理,转换(处理逻辑有 啦么大 实现),然后返回一个新的值
demo:
package com.itxs.demo08;import java.util.function.Function;/*** @Classname : demo06* @Description : TODO 加工接口 - 用于数据转换* @Author : lin_refuel@qq.com*/
public class demo06 {public static void main(String[] args) {// 将字符串转换为Integer类型数据// lambda省略方式//conversion("9527",str->Integer.parseInt(str));// 引用方式conversion("9527", Integer::parseInt);System.out.println("==========================");// 将Integer类型数据转换为String类型// lambda省略写法//conversion(9527,integer -> String.valueOf(integer));// 引用写法conversion(9527, String::valueOf);System.out.println("==========================");// TODO ===========二次加工===========conversion("9527",s->Integer.parseInt(s+1),// Integer类型数据95271加工出来了s->String.valueOf(s+1)); // String类型数据 95272加工出来了}/*** 将String类型数据转为Integer类型** @param str 目标字符串* @param ft01 转换接口*/private static void conversion(String str, Function<String, Integer> ft01) {Integer res = ft01.apply(str); // 字符串9527转为了Integer类型9527System.out.println(res + 1);// 9527 + 1 = 9528}/*** 将Integer类型数据转字符串类型** @param integer 目标整数类* @param ft01 转换接口*/private static void conversion(Integer integer, Function<Integer, String> ft01) {String res = ft01.apply(integer); //Integer类型9527转成String类型 9527System.out.println(res + 1); // 9527 + 1 = 95271,相当于是字符串拼接}/*** 二次加工* 字符串转Integer ,Integer转字符串* @param str 目标字符串* @param ft01 字符串转Integer的接口* @param ft02 Integer转字符串的接口*/private static void conversion(String str, Function<String, Integer> ft01, Function<Integer, String> ft02) {String RES = ft01.andThen(ft02).apply(str);System.out.println(RES + 1); // String类型95272 + 1 = 952721}
}