В предпоследней лекции своего курса Coursera профессор Одерски предложил следующее for
понимание в качестве последнего шага в прекрасном случае. изучать:
def solutions(target: Int): Stream[Path] =
for {
pathSet <- pathSets
path <- pathSet
if path.endState contains target
} yield path
В более ранней лекции он провел некоторые аналогии между for
пониманиями и SQL.
Я ищу способ yield
только для тех path
, у которых есть DISTINCT
endState
.
Есть ли способ вернуться из предложения фильтра того же понимания к элементам, которые уже были получены?
Другой подход может состоять в том, чтобы преобразовать pathSets
в Map
из endState
в path
перед оператором for
, а затем преобразовать его обратно в Stream
перед возвратом. Однако, похоже, что при этом теряются преимущества ленивых вычислений при использовании Stream
.
Более ранний метод из того же тематического исследования достиг тех же целей, но это уже была рекурсивная функция, в то время как этот не должен (кажется) быть рекурсивным.
Похоже, я мог бы использовать изменяемый Set
для отслеживания полученных endState
, но это меня не удовлетворяет, так как курс до сих пор успешно избегал использования изменчивости.
mutable.Set
действительно было бы простым и эффективным. Почему это так беспокоит вас?map
иflatMap
также реализованы с изменчивостью, даже если вы используете их с этимfor
. Таким образом, в вашей функции в любом случае есть изменчивость, но посторонний не имеет права использовать эту изменчивость, и это важно. Это также может сделать ваш код более читабельным. изменчивость не дьявол :) - person Kigyo   schedule 28.06.2014endState
уже был замечен. - person Daniel Ashton   schedule 30.06.2014DISTINCT
на основе на==
(как уже поддерживается потоками), ноDISTINCT
, который основан на пользовательской функции, в данном случае сравнивая атрибуты вещей, которые уже были получены. - person Daniel Ashton   schedule 03.07.2014val values = Seq(1, 2, 3, 4); for { value <- values; if !(__ contains 6) } yield value * 2
где__
относится к полученным значениям? - person EECOLOR   schedule 13.10.2014