Day24_函数式接口
Posted 黑盒思考
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Day24_函数式接口相关的知识,希望对你有一定的参考价值。
《Java自学180天笔记》
常用函数式接口_Supplier接口
package demo2;
import java.util.function.Supplier;
/*
常用的函数式接口
java.util.function.Supplier<T>接口仅包含一个无参的方法:T get().用来获取一个泛型参数指定类型的对象数据
Supplier<T>接口被称之为生产型接口,指定接口的泛型是什么类型,那么 接口中的get方法就会生产什么类型数据
*/
public class DemoSupplier {
//定义一个方法,方法的参数传递Supplier<T>接口,泛型执行String,get方法就会返回一个Sting
public static String getString(Supplier<String> sup) {
return sup.get();
}
public static void main(String[] args) {
//调用getString方法,方法的参数Supplier是一个函数式接口,所以可以传递Lambda表达式
String s = getString(()->{
//生产一个字符串,并返回
return "sai";
});
System.out.println(s);
//优化Lambda表达式
String s2 = getString(()->"sai");
System.out.println(s2);
}
}
常用函数式接口_Consumer接口
package demo2;
import java.util.function.Consumer;
/*
java.util.function.Consumer<T>接口正好与Supplier接口相反,它不是生产一个数据,而是消费一个数据
其数据类型由泛型决定。Consumer接口是一个消费型接口,泛型执行什么类型,就可以使用accept方法消费什么类型的数据
至于具体怎么消费(使用),需要自定义(输出,计算...)
*/
public class DemoConsumer {
/*
定义一个方法
方法的参数传递一个字符串姓名
方法的参数传递Consumer接口,泛型使用String
可以使用Consumer接口消费字符串的姓名
*/
public static void method(String name, Consumer<String> con) {
con.accept(name);
}
public static void main(String[] args) {
//调用method方法,传递字符串姓名,方法的另一个参数Consumer接口,是一个函数式接口
//所以可以传递Lambda表达式
method("黄欢",(String name)->{
String reName = new StringBuffer(name).reverse().toString();
System.out.println(reName);
});
}
}
欢黄
常用函数式接口_Predicate接口
package demo2;
import java.util.function.Predicate;
/*
java.util.function.Predicate<T>接口
作用:对某种数据类型的数据进行判断,结果返回一个boolean值
Predicate接口中包含一个抽象方法:boolean test(T t):用来对指定数据类型进行判断的方法
结果:符合条件,返回true
不符合条件,返回false
*/
public class DemoPredicate {
/*
定义一个方法
参数传递一个String类型字符串
传递一个Predicate接口,泛型使用String
使用Predicate中的方法test对字符串进行判断,并把判断的结果返回
*/
public static boolean checkString(String s, Predicate<String> pre){
return pre.test(s);
}
public static void main(String[] args) {
//定义一个字符串
String s = "abcde";
//调用checkString方法对字符串进行校验,参数传递字符串和Lambda表达式
boolean b = checkString(s,(String str)->{
//对参数传递的字符串进行判断,判断字符串的长度是否大于5,并把判断的结果返回
return str.length()>5;
});
System.out.println(b);
}
}
常用函数式接口_Function接口
package demo2;
import java.util.function.Function;
/*
java.util.function.Function<T,R>接口用来根据一个类型的数据得到另一个类型的数据,
前者称为前置条件,后者称为后置条件。Function接口中最主要的抽象方法为:R apply(T t),根据类型T的参数获取类型R的结果。使用的场景例如:将String类型转换为Integer类型。*/
public class DemoFunction {
/*
定义一个方法
方法的参数传递一个字符串类型的整数
方法的参数传递一个Function接口,泛型使用<String,Integer>
使用Function接口中的方法apply,把字符串类型的整数,转换为Integer类型的整数
*/
public static void change(String s, Function<String,Integer> fun){
Integer in = fun.apply(s);
System.out.println(in);
}
public static void main(String[] args) {
//定义一个字符串类型的整数
String s = "1234";
//调用change方法,传递字符串类型的整数,和Lanbda表达式
change(s,(String str)->{
//把字符串类型的整数,转换为Integer类型的整数返回
return Integer.parseInt(str);
});
}
}
常用函数式接口_Function接口 自定义函数模型拼接
package demo2;
import java.util.function.Function;
/*
练习:自定义函数模型拼接
题目
请使用Function进行函数模型的拼接,按照顺序需要执行的多个函数操作为:String str = "聂卫平,20";
分析:1.将字符串截取数字年龄部分,得到字符串;Function<String,String> "聂卫平,20"->"20"
2.将上一步的字符串转换成为int类型的数字;Function<String,Integer> "20" -> 20
3.将上一步的int数字累加100,得到结果int数字。Function<Integer,Integer> 20 -> 120
*/
public class DemoTest {
/*
定义一个方法
参数传递包含姓名和年龄的字符串
参数再传递3个Function接口用于类型转换
*/
public static int change(String s, Function<String,String> fun1,
Function<String,Integer> fun2,Function<Integer,Integer> fun3){
//使用andThen方法把三个转换组合到一起
return fun1.andThen(fun2).andThen(fun3).apply(s);
}
public static void main(String[] args) {
//定义一个字符串
String str = "聂卫平,20";
//调用change方法,参数传递字符串和3个Lambda表达式
int num = change(str,(String s)->{
//"聂卫平,20"
return s.split(",")[1];
},(String s)->{
//"20" -> 20
return Integer.parseInt(s);
},(Integer i)->{
//20->120
return i+100;
});
System.out.println(num);
}
}
以上是关于Day24_函数式接口的主要内容,如果未能解决你的问题,请参考以下文章