Нет, потоковый конвейер не позволяет на самом деле пропускать любую часть конвейера, поэтому вы вынуждены работать с любой условной логикой c внутри шагов, включая limit()
всегда в конвейере, или построение потока частями, которые были бы немного более разборчивыми (IMHO), чем if / else в вопросе
Stream<Item> s = items.stream()
.map(this::myMapper)
.filter(Objects::nonNull);
if(maxNumber > 0) {
s = s.limit(maxNumber);
}
List<Item> l = s.collect(Collectors.toList());
В простом случае, подобном здесь, это не делает большая разница, но вы часто видите, как обычные коллекции кода передаются через методы, преобразуются в потоки, а затем обратно в коллекции. В таких случаях может быть лучше работать с потоками по частям, пока вам действительно не понадобится collect()
.