You can, for example, like this:
String text = "aaabccccCCaB"; Arrays.stream(text.split("")) .collect(Collector.of(ArrayList<StringBuilder>::new, (o, s) -> { if (o.size() != 0 && o.get(o.size()-1).charAt(0) == s.charAt(0)) { StringBuilder sb = o.get(o.size() - 1); sb.append(s); } else { o.add(new StringBuilder(s)); } }, (o, o2) -> null)) .forEach(sb -> System.out.print((sb.length()>1 ? sb.length() : "") + sb.substring(0,1)));
PS Will not work on parallel streams due to:
(o, o2) -> null)
Also with the imposition of BiConsumer:
BiConsumer<List<StringBuilder>, String> biConsumer = (list, s) -> { if (list.size() != 0 && (list.get(list.size() - 1)).charAt(0) == s.charAt(0)) { StringBuilder sb = list.get(list.size() - 1); sb.append(s); } else { list.add(new StringBuilder(s)); } }; System.out.println(Arrays.stream(text.split("")) .collect(Collector.of(ArrayList::new, biConsumer, (o, o2) -> null)) .stream().map(sb -> (sb.length()>1 ? sb.length() : "") + sb.substring(0,1)) .collect(Collectors.joining()));
Another option:
String text = "aaabccccCCaB"; StringBuilder result = new StringBuilder(); IntStream.range(0, text.length()+1) .filter(value -> value==0 || value == text.length() || text.charAt(value) != text.charAt(value-1)) //или так .reduce((l, r) -> { result.append(rl > 1 ? rl : "") .append(text.substring(l, l+1)); return r;}) //или сразу выводить на консоль без StringBuilder //.reduce((l, r) -> { // System.out.print(rl > 1 ? rl : ""); // System.out.print(text.substring(l, l+1)); // return r;}) .isPresent(); System.out.println(result.toString());.