Java 8 Function class addThen默认方法

vic*_*cky 5 java lambda java-8

我正在学习Java-8 Lambda,我试图理解java.util.function.Function接口中的addThen默认方法.根据我的理解,addthen将首先执行First函数,然后它将执行第二个方法.所以我创建了一个如下程序:

//Pojo class 
  class Bike {

    public Bike(String bikeName, int price, String bikeType) {
        this.bikeName = bikeName;
        this.price = price;
        this.bikeType = bikeType;
    }

    private String bikeType;
    private String bikeName;
    private int price;

    public String getBikeType() {
        return bikeType;
    }

    @Override
    public String toString() {
        return "Bike [bikeType=" + bikeType + ", bikeName=" + bikeName + ", price=" + price + "]";
    }

    public void setBikeType(String bikeType) {
        this.bikeType = bikeType;
    }

    public String getBikeName() {
        return bikeName;
    }

    public void setBikeName(String bikeName) {
        this.bikeName = bikeName;
    }

    public int getPrice() {
        return price;
    }

    public void setPrice(int price) {
        this.price = price;
    }

}

//Main class
public class FunctionInbuildDefaultMethodsExample {

    public static void main(String[] args) {
        learningAndThen();
    }

    static void learningAndThen() {

        Function<Bike, String> updateBikefunction = (Bike bike) -> {
            System.out.println("OldBike Name is::" + bike.getBikeName());
            bike.setBikeName("PULSOR-200CC");
            return bike.getBikeName();
        };

        Function<Bike, String> updateBikePriceFunction = (Bike bike) ->  {

            System.out.println("OldBike Price is::" + bike.getPrice());
            bike.setPrice(95000);
            return bike.getBikeName();

        };

        /*
         * First update Bike and then price
         * */
         /*Compilation error here*/
        Function<Bike,String> bikeFunction = updateBikefunction.andThen(updateBikePriceFunction);
        bikeFunction.apply( new Bike("PULSOR-125CC", 65000, "BAJAJ"));

    }
 }
Run Code Online (Sandbox Code Playgroud)

我在线上遇到编译错误

 Function<Bike,String> bikeFunction =
updateBikefunction.andThen(updateBikePriceFunction);
Run Code Online (Sandbox Code Playgroud)

"函数类型中的方法和函数(函数)不适用于参数(函数)"

,在查看了Function接口的源代码后,我了解addThen的default方法正在寻找类型的实例Function<String,Book>.我的问题是,如果addThen默认方法应该执行第一个函数,然后是作为参数传递的下一个函数,为什么addThen函数接口的默认方法是以类型实例之外的方式编写的Function<String,Book>.

And*_*lko 3

updateBikefunction = Bike -> String
updateBikePriceFunction = Bike -> String

updateBikefunction -> updateBikePriceFunction = Bike -> String -> Bike -> String
                                                        ^^^^^^^^^^^^^^
Run Code Online (Sandbox Code Playgroud)

为了形成函数链,前一个结果应该是下一个函数的输出。这里这个条件被打破了。

可以updateBikefunction更改为Function<Bike, Bike>

    Function<Bike, Bike> updateBikefunction = (Bike bike) -> {
        ...
        return bike;
    };
Run Code Online (Sandbox Code Playgroud)

编译该行:

Function<Bike, String> bikeFunction = updateBikefunction.andThen(updateBikePriceFunction);
Run Code Online (Sandbox Code Playgroud)