I've found the following code snippet:
Function<Integer, Predicate<Integer>> smallerThan = x -> y -> y < x;
List<Integer> l = Arrays.asList(5, 6, 7, 23, 4, 5645,
6, 1223, 44453, 60182, 2836, 23993, 1);
List<Integer> list2 = l.stream()
.filter(smallerThan.apply(l.get(0)))
.collect(Collectors.toList());
System.out.println(list2);
As output I receive:
[4, 1]
How does the smallerThan
function in this example work, considering that we only pass one parameter smallerThan.apply(l.get(0))
?
smallerThan
is a Function
that accepts a single Integer
and returns a Predicate<Integer>
(a Predicate<Integer>
is a function that accepts a single Integer
and returns a boolean
).
smallerThan.apply(l.get(0))
returns a Predicate<Integer>
that looks like this:
y -> y < l.get(0)
i.e. it returns true
if the input passed to it is smaller than l.get(0)
.
When you pass that Predicate
to filter
, your Stream
pipeline keeps only the elements smaller than l.get(0)
.
Your pipeline can be re-written as:
List<Integer> list2 = l.stream()
.filter(y -> y < l.get(0))
.collect(Collectors.toList());
Since l.get(0)
is 5
, your pipeline returns all the elements of the original list smaller than 5
.