Identity Function in Java Streams
last modified May 25, 2025
The identity function is a fundamental concept in functional programming that plays an important role in Java Stream operations. This tutorial explains its purpose and demonstrates practical use cases.
Function.identity is a static method in Java's
java.util.function.Function
interface that returns a function which
always returns its input argument. It's essentially a no-op function that can be
useful in various stream operations where a function parameter is required but
no transformation is needed.
The identity function is particularly useful with Stream operations like
map
and collect
where you need to pass a function but
don't want to modify the elements. It serves as a clean, readable way to express
"no transformation" in functional pipelines.
Basic Identity Function Usage
This example demonstrates the simplest use of Function.identity
in a stream pipeline.
void main() { Stream.of("apple", "banana", "cherry") .map(Function.identity()) // .map(e -> e) .forEach(System.out::println); }
Here we use Function.identity
as the mapping function, which
results in no change to the stream elements. While this example doesn't
transform the data, it shows the basic syntax and behavior of the identity
function.
The syntax of the Function.identity
is equivalent to using a
e -> e
lambda expression, but using
Function.identity
is more concise and expressive.
$ java Main.java apple banana cherry
Identity in Collectors.toMap
One of the most common uses of Function.identity
is with
Collectors.toMap
when you want to use the stream elements as map
keys.
void main() { List<String> fruits = List.of("apple", "banana", "cherry"); Map<String, Integer> fruitMap = fruits.stream() .collect(Collectors.toMap( Function.identity(), // Use the string as key String::length // Use length as value )); System.out.println(fruitMap); }
In this example, we create a map where the keys are the fruit names (unchanged,
thanks to Function.identity
) and the values are the lengths of
the fruit names. The identity function clearly expresses that we're using the
original elements as keys.
$ java Main.java {banana=6, apple=5, cherry=6}
Identity vs Lambda Expression
This example compares using Function.identity
with an equivalent
lambda expression to demonstrate their equivalence.
void main() { // Using Function.identity() Stream.of(1, 2, 3) .map(Function.identity()) .forEach(System.out::println); // Using equivalent lambda Stream.of(1, 2, 3).map(x -> x) //.forEach(System.out::println); }
Both versions produce identical results. Function.identity
is
generally preferred as it's more explicit about the intent and may have slight
performance benefits in some cases as it's a singleton function.
$ java Main.java 1 2 3 1 2 3
Identity in GroupingBy
The identity function is often used with Collectors.groupingBy
when
you want to group by the elements themselves.
void main() { List<String> words = List.of("one", "two", "three", "one", "three"); Map<String, Long> counts = words.stream() .collect(Collectors.groupingBy( Function.identity(), Collectors.counting() )); System.out.println(counts); }
Here we use Function.identity
as the classifier function for
grouping, which means we're grouping by the actual string values. This produces
a frequency count of each word in the list.
$ java Main.java {one=2, two=1, three=2}
Identity with Optional
The identity function can be useful when working with Optional
in
stream operations.
void main() { List<Optional<String>> optionals = List.of( Optional.of("🍎 Apple"), Optional.empty(), Optional.of("🍌 Banana"), Optional.of("🍒 Cherry"), Optional.empty(), Optional.of("🍍 Pineapple")); // Extract present values without transformation List<String> values = optionals.stream() .flatMap(opt -> opt.map(Function.identity()).stream()) .collect(Collectors.toList()); System.out.println(values); }
This example demonstrates using Function.identity
to process a
stream of Optional
values, extracting the values when present
without transforming them.
$ java Main.java [🍎 Apple, 🍌 Banana, 🍒 Cherry, 🍍 Pineapple]
Source
Java Function.identity() Documentation
The identity function is a simple but powerful tool in Java Streams that clearly expresses the intent of "no transformation" in functional pipelines. While it doesn't modify data, it serves important roles in stream operations that require function parameters.
Author
List all Java tutorials.