for (Canvas canvas : list) {
}
NetBeans предлагает мне использовать «функциональные операции»:
list.stream().forEach((canvas) -> {
});
Но почему это предпочтительнее ? Во всяком случае, труднее читать и понимать. Вы звоните stream()
, затем forEach()
используете лямбда-выражение с параметром canvas
. Я не вижу, как это лучше, чем for
цикл в первом фрагменте.
Очевидно, я говорю только из эстетики. Возможно, здесь есть техническое преимущество, которого мне не хватает. Что это такое? Почему я должен использовать второй метод вместо?
java
lambda
java8
stream-processing
Омега
источник
источник
Ответы:
Потоки обеспечивают намного лучшую абстракцию для составления различных операций, которые вы хотите выполнить над наборами или потоками поступающих данных. Особенно, когда вам нужно отобразить элементы, отфильтровать и преобразовать их.
Ваш пример не очень практичен. Рассмотрим следующий код с сайта Oracle .
может быть написано с использованием потоков:
Второй вариант гораздо более читабелен. Поэтому, когда у вас есть вложенные циклы или различные циклы, выполняющие частичную обработку, это очень хороший кандидат для использования Streams / Lambda API.
источник
stream.map(f).map(g)
≡stream.map(f.andThen(g))
) сборки / уменьшение синтеза (при создании потока в одном методе , а затем передать его другой метод , который потребляет его, компилятор может исключить поток) и поток слияние (который может расплавить много потоков опов вместе в один императивный цикл), который может сделать потоковые операции намного более эффективными. Они реализованы в компиляторе GHC Haskell, а также в некоторых других компиляторах Haskell и других функциональных языках, и есть экспериментальные реализации для Scala.Еще одно преимущество использования функционального потокового API заключается в том, что он скрывает детали реализации. Он описывает только то, что должно быть сделано, а не как. Это преимущество становится очевидным при рассмотрении изменений, которые необходимо выполнить, чтобы перейти от однопоточного к параллельному выполнению кода. Просто измените
.stream()
к.parallelStream()
.источник
Это очень субъективно. Я считаю, что вторую версию гораздо легче читать и понимать. Он соответствует тому, как это делают другие языки (например, Ruby, Smalltalk, Clojure, Io, Ioke, Seph), требует меньше концепций для понимания (это просто обычный вызов метода, как и любой другой, тогда как первый пример - специализированный синтаксис).
Во всяком случае, это вопрос знакомства.
источник