JAVA8引入函数式编程后,增加了灵活性,原来需要通过ScriptEngine调用脚本语言,现在通过Function接口即可。
方便了编码,代码也比较简洁些。
1. Function
函数式编程的格式如下几种方式:
a. 标准方式
(Type1 param1, Type2 param2, …, TypeN paramN) -> {
statment1;
statment2;
//………….
return statmentM;
}
b.省略类型
(param1,param2, …, paramN) -> {
statment1;
statment2;
//………….
return statmentM;
}
c.参数为1个时,可用省略参数小括号
param1 -> {
statment1;
statment2;
//………….
return statmentM;
}
d. 语句只有一条时,可省略语句大括号
param1 -> statment
======
Function典型的应用场景为:A. 1个只有1个方法的接口,避免写匿名类; B. 接受Fuction接口为参数的方法
例子1:正常情况下Thread构造函数中接受实现了Runnable接口的匿名类:
new Thread(new Runnable(){
@Override
public void run() {
System.out.println(“hello new thread”);
}
});
用Function方式实现:
new Thread(()->System.out.println(“hello new thread”)).run();
这里Runnable已经加了@FunctionalInterface标注,是不是简洁了很多,这种写法就是对于初学者看起来可能比较莫名。是不是简洁了很多,这种写法就是对于初学者看起来可能比较莫名。
例子2:自己实现一个@FunctionalInterface接口
@FunctionalInterface
public interface BaseAdapterInf {
public abstract void work(String name);
}
TestFunction类实现1个调用接口的方法
public void invokeRule3(BaseAdapterInf adapter, String name){
adapter.work(name);
}
具体调用:
TestFunction testf=new TestFunction();
testf.invokeRule3((name)->System.out.println(name+ ” welcome!”),”lisi”);
例子3: 实现1个调用Function方法的类
import java.util.function.Function;
TestFunction类实现方法:
public void invokeRule2(String input, Function<String, Integer> function){
int len= function.apply(input); //需要有返回值
System.out.println(len);
//return result;
}
}
具体调用:
TestFunction testf=new TestFunction();
testf.invokeRule2(“hello world”, (input)->{
return input.length();
});
}
2. 方法引用
方法引用的标准形式是:类名::方法名。(注意:只需要写方法名,不需要写括号)
类型 示例
引用静态方法 ContainingClass::staticMethodName
引用某个对象的实例方法 containingObject::instanceMethodName
引用某个类型的任意对象的实例方法 ContainingType::methodName
引用构造方法 ClassName::new
静态方法引用例子:
String::valueOf 等价于lambda表达式 (s) -> String.valueOf(s)
Math::pow 等价于lambda表达式 (x, y) -> Math.pow(x, y);
###本文中为原创,引用者请注明出处