Se você olhar IntFunction
, pode ficar mais claro: IntFunction<R>
é a FunctionalInterface
. Ele representa uma função que recebe um int
e retorna um valor do tipoR
.
Nesse caso, o tipo de retorno R
também é a FunctionalInterface
, ou seja, um IntUnaryOperator
. Então o primeiro função (externa) retorna uma função.
Neste caso: Quando aplicado a um int
, curriedAdd
deve retornar uma função que novamente recebe um int
(e retorna novamente int
, porque é isso que IntUnaryOperator
faz).
Na programação funcional, é comum escrever o tipo de uma função como param -> return_value
e você vê exatamente isso aqui. Portanto, o tipo de curriedAdd
é int -> int -> int
(ou int -> (int -> int)
se preferir, melhor).
A sintaxe lambda do Java 8 vai junto com isso. Para definir tal função, você escreve
a -> b -> a + b
que é muito semelhante ao cálculo lambda real:
λa λb a + b
λb a + b
é uma função que recebe um único parâmetro b
e retorna um valor (a soma). λa λb a + b
é uma função que aceita um único parâmetro a
e retorna outra função de um único parâmetro. λa λb a + b
retorna λb a + b
com a
definido para o valor do parâmetro.