Nếu bạn nhìn vào IntFunction
nó có thể trở nên rõ ràng hơn: IntFunction<R>
là a FunctionalInterface
. Nó đại diện cho một hàm nhận một int
và trả về một giá trị kiểu R
.
Trong trường hợp này, kiểu trả về R
cũng là a FunctionalInterface
, cụ thể là an IntUnaryOperator
. Vì vậy, bản thân hàm đầu tiên (bên ngoài) trả về một hàm.
Trong trường hợp này: Khi được áp dụng cho an int
, curriedAdd
được cho là trả về một hàm lại nhận một int
(và trả về một lần nữa int
, vì đó là những gì IntUnaryOperator
làm được).
Trong lập trình hàm, người ta thường viết kiểu của hàm là param -> return_value
và bạn thấy chính xác ở đây. Vì vậy, loại curriedAdd
là int -> int -> int
(hoặc int -> (int -> int)
nếu bạn thích điều đó tốt hơn).
Cú pháp lambda của Java 8 đi cùng với điều này. Để xác định một chức năng như vậy, bạn viết
a -> b -> a + b
rất giống với phép tính lambda thực tế:
λa λb a + b
λb a + b
là một hàm nhận một tham số duy nhất b
và trả về một giá trị (tổng). λa λb a + b
là một hàm chấp nhận một tham số duy nhất a
và trả về một hàm khác của một tham số duy nhất. λa λb a + b
trả về λb a + b
với a
giá trị tham số được đặt.