A large number of new functional interfaces have been added to the java.util.function package. Here are a few examples:
- Function<T, R> - take T as input, return R as output
- Predicate<T> - take T as input, return a boolean as output
- Consumer<T> - take T as input, don't return anything
- Supplier<T> - take no input, return T
- BinaryOperator<T> - take two T's as input, return one T as output
Functional interfaces provide target types for lambda expressions and
method references. Each functional interface has a single abstract method,
called the functional method for
that functional interface, to which the lambda expression's parameter and
return types are matched or adapted. Functional interfaces can provide a target
type in multiple contexts, such as assignment context, method invocation, or
cast context:
// Assignment context
Predicate<String> p = String::isEmpty;
//
Method invocation context
stream.filter(e -> e.getSize() > 10)...
// Cast
context
stream.map((ToIntFunction) e -> e.getSize())...
The interfaces in this package are general purpose
functional interfaces used by the JDK, and are available to be used by user
code as well. While they do not identify a complete set of function shapes to
which lambda expressions might be adapted, they provide enough to cover common
requirements. Other functional interfaces provided for specific purposes, such
as FileFilter, are defined in
the packages where they are used.
The interfaces in this package are annotated with FunctionalInterface. This annotation is not a
requirement for the compiler to recognize an interface as a functional
interface, but merely an aid to capture design intent and enlist the help of
the compiler in identifying accidental violations of design intent.
Functional interfaces often represent abstract
concepts like functions, actions, or predicates. In documenting functional
interfaces, or referring to variables typed as functional interfaces, it is common
to refer directly to those abstract concepts, for example using "this
function" instead of "the function represented by this object".
The functional interfaces in this package follow an
extensible naming convention, as follows:
- There
are several basic function shapes, including Function (unary function from T to R), Consumer (unary function from T to void), Predicate (unary function from T to boolean), and Supplier (nilary function to R).
- Function
shapes have a natural arity based on how they are most commonly used. The
basic shapes can be modified by an arity prefix to indicate a different
arity, such as BiFunction (binary function from T and U to R).
- There
are additional derived function shapes which extend the basic function
shapes, including UnaryOperator (extends Function) and BinaryOperator (extends BiFunction).
- Type
parameters of functional interfaces can be specialized to primitives with
additional type prefixes. To specialize the return type for a type that
has both generic return type and generic arguments, we prefix ToXxx, as inToIntFunction.
Otherwise, type arguments are specialized left-to-right, as in DoubleConsumer or ObjIntConsumer.
(The type prefix Obj is used to indicate that we
don't want to specialize this parameter, but want to move on to the next
parameter, as in ObjIntConsumer.) These schemes can be
combined, as in IntToDoubleFunction.
- If
there are specialization prefixes for all arguments, the arity prefix may
be left out (as in ObjIntConsumer).
No comments:
Post a Comment