Streams in Java, can't figure this code out

masterofdisaster :

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))?

Eran :

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.

Guess you like

Origin http://10.200.1.11:23101/article/api/json?id=431082&siteId=1