Вы, вероятно, обеспокоены множественными вызовами replace
, которые на самом деле не связаны с функциональным программированием. Один из способов заменить эти вызовы - использовать регулярное выражение и replaceAll
:
.map(s -> s.replaceAll("[aeiou]", ""))
Эта единственная карта заменяет все 5 карт, которые удаляют гласные.
Регулярным выражением вы также можно удалить все не гласные. Таким образом, вам не нужно вычитать tot
:
int vowels = l.stream().map(s -> s.replaceAll("[^aeiou]", ""))
.map(s -> s.length()).reduce(0, Integer::sum);
// no need to do anything else!
Теперь у вас еще есть два последовательных map
с, вы можете объединить их в один:
int vowels = l.stream().map(s -> s.replaceAll("[^aeiou]", "").length())
.reduce(0, Integer::sum);
Это теперь более функционально, потому что я убрал шаг вычитания tot
. Эта операция теперь описывается только как композиция функции (что касается уровня абстракции), а не как группа «шагов».