2013-12-12 2 views
3

Когда мы используем методы, как filter, mapToInt, sum и т.д., и передать им лямбда-выражения я не понимаю, если операции являются метод себя или лямбда, что мы проходим.Java 8 и агрегатные операции на потоке

Я хотел бы знать правильную терминологию.

Я думаю, что лямбда-это функция и, следовательно, операция, которую мы передаем методам , которые используют это для получения результатов.

Почему так же говорят, что filter, sum и т. Д. Являются операциями, которые используют функцию как их аргументы?

Есть ли как правильная терминология?

ответ

1

Не уверен, если это обычно принято, но я думаю, что это так:

функция является то, что принимает аргументы и производит значение, в идеале без побочных эффектов (хотя, это не enforcable в Java). Используйте это, если хотите подчеркнуть математический/функциональный аспект.

Подпрограмма/процедура - это именованный фрагмент кода, который используется повторно для его побочного эффекта.

Метод, как функции и подпрограммы реализованы/записаны на Java. Нет такой функции, как функция или процедура, которая не принадлежит к некоторому классу.

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

Операция - это функция или процедура.

Итак, в зависимости от того, как вы хотите посмотреть на него: поскольку речь идет о Java, вы можете просто называть все «методом». Но иногда вы хотите подчеркнуть разные аспекты. Как и в вашем примере:

фильтр, сумма и т.д., операции, которые используют функцию в качестве своих аргументов

Здесь мы могли бы сказать: "filter это метод, который принимает ссылку на функциональный интерфейс как аргумент ", но это как-то изменяет намерение предложения.

+0

лямбда-выражения не синтаксический сахар: см http://programmers.stackexchange.com/a/181743/59134 –

+0

@MauriceNaftalin Я понимаю технический момент. Но вы видите, что OP просто путают с терминологией, и поэтому пока не помешает думать об лямбда-выражениях таким образом - просто для их демистификации. Я тем не менее отредактирую свой пост, чтобы не вводить другой запутанный термин, например, синтаксический сахар. – Ingo

5

Как методы Stream, так и аргументы лямбда, которые они принимают, являются, в общем, операциями. Это не смущает, когда мы привыкнем к идее, что аргументы вызова метода могут быть функциями. Метод Stream применяет функцию, которая была дана значениям в ее потоке, либо для создания нового потока (промежуточные методы), либо для получения некоторого агрегированного результата (терминальные методы).

Для более подробного объяснения см http://www.lambdafaq.org/why-are-lambda-expressions-being-added-to-java/

1

Lambda является функцией/обратного вызова, которая, как правило, передается в качестве аргумента.Подход, чтобы понять это, рассмотрим вам нужно искать значение в списке:

Java 7:

int i = Arrays.asList(1,2,3,4,5,6).indexOf(3); 

Это даст единственный элемент. Теперь, что происходит, когда требуется более динамичный запрос - он может собирать эти элементы с помощью цикла. Но если он хочет сделать это таким же образом, он мог бы передать лямбда в качестве аргумента:

Java 8 (как это может быть):

List<Integer> collect = asList(1, 2, 3, 4, 5, 6).filter(x -> x >= 2 && x < 4); 

реального Java 8 примера API является немного более многословен:

List<Integer> collect = Arrays.asList(1, 2, 3, 4, 5, 6) 
    .stream() 
    .filter(x -> x >= 2 && x < 4)   
    .collect(Collectors.toList()); 
0

Помните, , что мы переходим к фильтру как функция просто фильтрация логика. Хотя функция фильтра уже ожидает функцию, которая имеет логику фильтрации. Функция фильтра специально принимает функцию, которая возвращает логическое значение, и решает, передавать ли текущий элемент в потоке или просто отбросить его.

Надеюсь, я правильно понял ваш вопрос. Более подробную информацию о потоках здесь является продолжающийся ряд статьи на Java 8 Стрим API amitph.com > Java 8 Streams API Tutorials

Смежные вопросы