Java lambda表达式设计概要

XiLaiTL大约 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.xxxopen in new window()进行方法的调用。

lambda为接口带来了什么?

当接口内只有一个抽象方法时,我们依然可以为接口添加其他内容,并同时让接口当作lambda的类型使用。

  1. 静态方法。通过interfacename.xxx进行调用。
  2. 默认方法。可以进行继承重写。
  3. 属性。默认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方法)。

真真正正成为一个实例。

上次编辑于:
贡献者: XiLaiTL