Недавно я начал играть с Java 8, ранее делал бит и куски в Haskell/ Scala. Я пытаюсь играть с функциями более высокого порядка на Java, например, map
или forEach
, и я изо всех сил пытаюсь понять, какой мотивацией он должен был подтолкнуть все к идеологии Stream
. Я понимаю, что это дает хорошую общую абстракцию, она должна быть ленивой, но рассмотрим очень простой, общий пример:
list.map(x -> do_sth(x));
очень распространенная идиома, ожидая, что это вернет a List<T>
. Теперь, в Java 8, мне нужно сделать sth этого типа:
list.stream().map(x -> doSth(x)).collect(Collectors.toList())
Теперь, насколько я вижу это, поток не будет применять карту до тех пор, пока не будет вызван сбор, поэтому будет проходить один проход через коллекцию под капотом. Я не вижу, почему эти общие примеры использования для карт, списки, такие как map.toList()
, list.groupBy()
, не будут добавлены в соответствующие интерфейсы? Есть ли базовое дизайнерское решение, которое я здесь отсутствует?