(注:本人编程小白,利用网络上的资源自学java,以下内容是我的学习笔记及感悟,可能会有描述不准确甚至错误的情况,还请各位大佬多多指教;如果你跟我一样也是属于入门学习阶段,建议仅将以下内容作为参考,不要过度相信)
关于函数式接口:
定义:有且仅有一个抽象方法的接口
代码示例:
关于接口:
@FunctionalInterface
//强制检查是否符合函数式接口(有且仅有一个抽象方法)
public interface MyDIYlambdaInterface {
void mymethod();//public abstract可省略
}
关于方法
//自定义的接口可作为参数
public class Demotry {
public static void dosomething(MyDIYlambdaInterface myin){
myin.mymethod();
}
//实现示例:重写接口中的抽象方法
public static void main(String[] args) {
dosomething(()-> System.out.println("========"));
}
}
Lambda的延迟执行
解决性能浪费问题
关于接口
@FunctionalInterface//强制检查是否符合函数式接口(有且仅有一个抽象方法)
public interface MyDIYlambdaInterface {
String messageBuilder();
}
关于方法
public class Demotry {
public static void log(int i,MyDIYlambdaInterface myin){
if(i==1){
System.out.println(myin.messageBuilder());
}
}
public static void main(String[] args) {
String a="Happy birthday ";
String b="to ";
String c="you";
log(1,()->a+b+c);
}
}
输出结果:“Happy birthday to you”
这样做的原因:
如果是常规写法,在log方法中直接sout,即使传入的int数据不符合要求,字符串也已经被拼接,但是又无法输出,就会造成浪费。
而如果将抽象方法封装在接口中,该接口作为log方法的参数,然后在主方法中调用方法时如果前一个参数符合,再重写所需操作,就可以解决这个问题。
常用的函数式接口
Supplier
java.util.function.Supplier 接口仅包含一个无参的方法: T get() 。用来获取一个泛型参数指定类型的对
象数据。
Consumer
java.util.function.Consumer ,如其名,“消费数据”,其数据类型由泛型决定。
!!!Predicate
java.util.function.Predicate
方法: boolean test(T t) :用于判断
应用:筛选合适信息
import java.util.ArrayList;
import java.util.List;
import java.util.function.Predicate;
public class DemoPredicate {
public static void main(String[] args) {
String[] array={"迪丽热巴,女","易烊千玺,男","宋威龙,男","刘诗诗,女"};
List<String> list =Mytest(array, s-> "女".equals(s.split(",")[1]),
s-> s.split(",")[0].length() == 4);
System.out.println(list);
}
public static List<String> Mytest(String[] array,Predicate<String> one,Predicate<String> two){
List<String> newlist=new ArrayList<>();
for (String every:array)//遍历这个放进去的集合
{ if(one.and(two).test(every)){
newlist.add(every);
}
}
return newlist;
}
}
Function – java.util.function.Function<T,R> 根据T类型,得到R类型
抽象方法:apply : R apply(T t)
例子:提取所需年龄数据字符串,转换为整型并输出
import java.util.function.Function;
public class AboutFunction {
public static void main(String[] args) {
String goal="刘诗诗,30";
String age=goal.split(",")[1];//将年龄字符串提取出来
System.out.println(Myadd(age,s->Integer.parseInt(s)));
}
public static int Myadd(String age,Function<String,Integer> fun){
return fun.apply(age);
}
输出结果:30