следовательно, вывод

ел следующий фрагмент кода:

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

В качестве вывода я получаю:

[4, 1]

Как работаетsmallerThan Функция в этом примере работает, учитывая, что мы передаем только один параметрsmallerThan.apply(l.get(0))?

 Boris the Spider26 нояб. 2017 г., 16:35
ВидетьКарринг.
 Oliver Charlesworth26 нояб. 2017 г., 12:04
smallerThan это функция, которая возвращает функцию.
 jrook26 нояб. 2017 г., 12:06
Вы можете переписатьsmallerThan нравится:x -> (y -> (y < x))

Ответы на вопрос(3)

Решение Вопроса

smallerThan этоFunction который принимает одинInteger и возвращаетPredicate<Integer> (аPredicate<Integer> это функция, которая принимает одинInteger и возвращаетboolean).

smallerThan.apply(l.get(0)) возвращаетPredicate<Integer> это выглядит так:

y -> y < l.get(0)

то есть возвращаетсяtrue если входные данные переданы меньшеl.get(0).

Когда вы передаете этоPredicate вfilter, твойStream трубопровод содержит только элементы меньше, чемl.get(0).

Ваш конвейер может быть переписан как:

List<Integer> list2 = l.stream()
    .filter(y -> y < l.get(0))
    .collect(Collectors.toList());

посколькуl.get(0) является5ваш конвейер возвращает все элементы исходного списка меньше5.

smallerThan принимает число и возвращаетPredicate объект, в этом случае мы применяем этот предикат к каждому элементу потока.

Так,l.get(0) извлечет первое значение из спискаl который(5)Затем мы передаем егоsmallerThan функция и эта функция возвращает предикат с критериямиy -> y < x; который читается какmsgstr "если задано число, верните true, если оно меньше 5" следовательно, вывод[4, 1]

карринг", и до Java 8 это было возможно, например, через анонимные классы, но это было гораздо более многословно. В конечном счете, этоFunction который возвращаетFunction и хотя это не очень распространено в Java (пока), в других функциональных языках оно используется довольно интенсивно.

Ваш ответ на вопрос