Si lo miras IntFunction, podría ser más claro: IntFunction<R>es un FunctionalInterface. Representa una función que toma inty devuelve un valor de tipo R.
En este caso, el tipo de retorno Rtambién es a FunctionalInterface, es decir, an IntUnaryOperator. Entonces, la primera función (externa) en sí misma devuelve una función.
En este caso: cuando se aplica a an int, curriedAddse supone que devuelve una función que vuelve a tomar an int(y vuelve de nuevo int, porque eso es lo que IntUnaryOperatorhace).
En la programación funcional, es común escribir el tipo de función como param -> return_valuey ve exactamente eso aquí. Entonces el tipo de curriedAddes int -> int -> int(o int -> (int -> int)si te gusta más).
La sintaxis lambda de Java 8 va de la mano con esto. Para definir tal función, escribe
a -> b -> a + b
que es muy similar al cálculo lambda real:
λa λb a + b
λb a + bes una función que toma un solo parámetro by devuelve un valor (la suma). λa λb a + bes una función que acepta un solo parámetro ay devuelve otra función de un solo parámetro. λa λb a + bvuelve λb a + bcon aestablecido en el valor del parámetro.