Я не думаю, что Stream
s - это подходящая вещь для кодирования длин серий.Потоки и состояния просто не очень хорошо сочетаются друг с другом.Для подсчета количества уже подсчитанных вами символов неизбежно потребуется состояние.Один из способов сделать это - использовать reduce(U identity, BiFunction<U, ? super T, U> accumulator, BinaryOperator<U> combiner)
и передавать ему анонимные классы (да, анонимные классы), а в этих анонимных классах вы можете хранить переменную, которая записывает, сколько символов в нем есть.Затем вы можете использовать StringBuilder
s для добавления закодированных строк.Это не элегантное решение.
Я немного креативен и сделал это:
String str = "aaaajjjfjjeeee";
String result = Pattern.compile("(?<=(.))(?!\\1)")
.splitAsStream(str)
.map(x ->
Character.toString(x.charAt(0)) +
Integer.toString(x.length()))
.collect(Collectors.joining());
System.out.println(result);
Я действительно использую потоки, но немного обманул и использовал регулярное выражение:).