Java lambda表达式设计概要
大约 2 分钟
Java lambda表达式设计概要
Java 的接口作为了什么?
java的接口提供了“类型”的概念。
接口被用于注解和lambda
Java的lambda的定义与使用
interface Body {
String detailed(String head);
}
public class LambdaExpressions {
static Body bod = (h) -> { return h + " No Parens!";};
static Body bod2 = h -> h + " More details";
public static void main(String[] args) {
System.out.println(bod.detailed("Oh!"));
System.out.println(bod2.detailed("Hi!"));
reCall(bod);
}
public static void reCall(Body body){
System.out.println(body.detailed("Oh!"));
}
}
lambda需要函数的类型(参数类型、参数个数、返回值类型、返回值个数)
Java没有相应的函数类型,因此改良了接口作为函数类型的承担者,具体做法就是,interface的类型就是其第一个抽象方法的函数类型。
可以添加函数式注解@FunctionalInterface
,当接口中抽象方法多于一个时产生编译期错误。
现在,每一个lambda表达式相当于interface实例下的一个对象了,使用lambda.xxx()进行方法的调用。
lambda为接口带来了什么?
当接口内只有一个抽象方法时,我们依然可以为接口添加其他内容,并同时让接口当作lambda的类型使用。
- 静态方法。通过interfacename.xxx进行调用。
- 默认方法。可以进行继承重写。
- 属性。默认static final的属性。
以此可以使用函数式接口封装容器, 利用函数式的闭包让包装总是对应某一个容器本身。
public interface iBlockStateInventory {
//作为lambda类型的唯一抽象方法
//the unique abstract function of interface and provide the lambda type.
NonNullList<BlockState> getBlockStates();
BlockState defaultEmptyBlockState = Blocks.AIR.defaultBlockState();
//利用函数式构造参数类型的包装器,保证返回的实例与原来相同
//Creates an inventory from the block list.Must return the same instance every time it's called.
static iBlockStateInventory of(NonNullList<BlockState> blockStates){
return ()->blockStates;
}//interface ::=functional
//创建同类型新的容器 Creates a new inventory with the size.
static iBlockStateInventory withSize(int size){
return of(NonNullList.withSize(size, defaultEmptyBlockState));
}
default int size(){return getBlockStates().size();}
default boolean isEmpty(){
for(BlockState blockState:getBlockStates()){
if (!(blockState.getBlock() instanceof AirBlock)) return false;
}
return true;
}
default BlockState getBlockState(int slot){return getBlockStates().get(slot);}
default BlockState removeBlockState(int slot){
return slot>=0&&slot<size()
? getBlockStates().set(slot,defaultEmptyBlockState)
:defaultEmptyBlockState;
}
default void setBlockState(int slot,BlockState blockState){
getBlockStates().set(slot,blockState);
}
default void clear(){getBlockStates().clear();}
}
调用
iBlockStateInventory.of(XXXlist).size()
对lambda接口进行继承/实现
继承得到了接口的所有default方法和静态属性。
并且需要重写接口的抽象方法(lambda方法)。
真真正正成为一个实例。