函数式接口,只包含一个抽象方法,可以在接口上使用@FuntionalInterface来检查它是否是一个函数式接口。
java内置四大核心函数式接口
Consumer接口使用场景举例:
看的出来在写方法happyTime时,形参是一个接口,这个形参存在的意义就在于函数体里让别人调用它的抽象方法。妙就妙在调用happyTime()方法时,你是怎么给它传参的,怎么用lambda表达式去实现这个接口的。你所看到的最终程序也就是什么样的。
函数型接口:Function<R, T>
public void test3 () {
String s = strOperar(" asdf ", x -> x.substring(0, 2));
System.out.println(s);
String s1 = strOperar(" asdf ", x -> x.trim());
System.out.println(s1);
}
public String strOperar(String str, Function<String, String> fun) {
return fun.apply(str);
}
Predicate 接口举例:
String s;//String一个字符串s
pre.test(s)//用断言型接口的实例去调用他自己的test方法,把s当形参传进去
返回肯定是一个boolean值,用test方法来测试s到底满不满足我们所制定的规则。
制定规则的地方就是在pre中了,规则取决于它是怎么实现test()方法的。
Optional类作用:不用显示的去进行空值检测
要是使用Optional类的话,Optional的俩个常用方法:
Optional.ofNullable(T t),创建一个Optional实例,t可以为null
orElse(T t),要是调用者optionalGirl(是一个Optional实例)不为空,返回该实例容器的对象,要是调用者为空,返回orElse(T t)中的 t。
Optional<Girl> optionalGirl=Optional.ofNullable(girl);
Girl girl1=optionalGirl.orElse(new Girl("瑶瑶公主"))
对下图代码存在的问题(可能发生空指针异常)进行改造
public String getGirlName(Boy boy){
//boy可能为null,boy.getGirl()也可能为null
return boy.getGirl().getName();
}
我们在调用时getGirlName()时就很可能发生空指针异常,要么boy本身为null,要么boy.getGirl()是一个null.怎么避免呢,没错就是加 if判断
public string getGirlName(Boy boy){
if(boy!=null){
Girl girl=boy.getGirl();
if(girl!=null){
return girl.getName();
}
}
return null;
}
对下图代码存在的问题用Optional改造
public String getGirlName(Boy boy){
Optional<Boy> optional = Optional.ofNullable(boy);
//此时boy1一定非空
Boy boy1 = optional.orElse(new Boy(new Girl("公孙离")));
Optional<Girl> optional1 = Optional.ofNullable(boy1.getGirl());
//此时girl一定非空
Girl girl = optional1.orElse(new Girl("杨玉环"));
return girl.getName();
}