public static int construction(String myString) {
Set<Character> set = new HashSet<>();
int count = myString.chars() // returns IntStream
.mapToObj(c -> (char)c) // Stream<Character> why is this required?
.mapToInt(c -> (set.add(c) == true ? 1 : 0)) // IntStream
.sum();
return count;
}
El código anterior no se compilará sin:
.mapObj(c -> (char)c)
// <Character> Stream<Character> java.util.stream.IntStream.mapToObj(IntFunction<? extends Character> mapper)
Si quito, me sale el siguiente error
The method mapToInt((<no type> c) -> {}) is undefined for the type IntStream
Alguien puede explicar esto? Parece que estoy empezando con y IntStream, la conversión a un flujo de caracteres y luego de vuelta a IntStream.
El método CharSequence::chars
devuelve el IntStream
, que por supuesto no proporciona ningún método para la conversión de int, tal como mapToInt
, pero mapToObj
en su lugar. Por lo tanto el método IntStream::map(IntUnaryOperator mapper)
que tanto se lleva vuelve int
así deberá utilizarse, ya IntUnaryOperator
hace lo mismo como Function<Integer, Integer>
o 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();
Además, el uso Set<Integer>
ayuda a evitar la conversión a un personaje:
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();
Sin embargo, independientemente de lo que se intenta lograr, su código es erróneo por principio, los comportamientos NO sin estado para ser exactos. Considere el uso de la siguiente fragmento de la cual los resultados lambda expresiones no son dependientes en el resultado de una operación no determinista, tal como Set::add
.
resultados de tuberías de flujo pueden no determinista o incorrecta si los parámetros de comportamiento para las operaciones de secuencias son con estado.
long count = myString.chars() // IntStream
.distinct() // IntStream
.count();