Метод CharSequence::chars
возвращает IntStream
, что, конечно, не обеспечивает какой-либо метод преобразования в int, например mapToInt
, но mapToObj
вместо,Следовательно, метод IntStream::map(IntUnaryOperator mapper)
, который также принимает возврат int
, должен использоваться, так как IntUnaryOperator
делает то же самое, что и Function<Integer, Integer>
или UnaryOperator<Integer>
:
int count = myString.chars() // IntStream
.map(c -> (set.add((char) c) ? 1 : 0)) // IntStream
.sum();
long count = myString.chars() // IntStream
.filter(c -> set.add((char) c)) // IntStream
.count();
Кроме того, использование Set<Integer>
помогает избежать преобразования в символ:
Set<Integer> set = new HashSet<>();
int count = myString.chars() // IntStream
.map(c -> (set.add(c) ? 1 : 0)) // IntStream
.sum();
long count = myString.chars() // IntStream
.filter(set::add) // IntStream
.count();
Однако, независимо от того, чего вы пытаетесь достичь, ваш кодошибочно по принципу, НЕТ безгражданства , если быть точным.Рассмотрите возможность использования следующего фрагмента, в котором результаты лямбда-выражений не зависят от результата недетерминированной операции, такой как Set::add
.
Результаты конвейерного потока могут быть недетерминированнымиили неверный, если поведенческие параметры для операций потока являются состоящими.
long count = myString.chars() // IntStream
.distinct() // IntStream
.count();