Estou tentando acessar os recursos do Java 24. Mas não consigo acessar. Estou usando o programa abaixo
public static void main(String[] args) {
Stream.of("apple", "banana", "kiwi")
.gather((word, out) -> {
for (char ch : word.toCharArray()) {
if (Character.isLowerCase(ch)) {
out.accept(ch); // emit each lowercase letter
}
}
})
.forEach(System.out::println);
}
Mas está me dando a exceção de tempo de compilação abaixo
The method gather(Gatherer<? super String,?,R>) in the type Stream<String> is not applicable for the arguments ((<no type> word, <no type> out) -> {})
Exception in thread "main" java.lang.Error: Unresolved compilation problems:
The method gather(Gatherer<? super String,?,R>) in the type Stream<String> is not applicable for the arguments ((<no type> word, <no type> out) -> {})
Lambda expression's signature does not match the signature of the functional interface method integrator()
Eu habilitei os recursos de visualização nas propriedades
Mas ainda não é possível executar recursos de visualização. Estou esquecendo de algo aqui?
Estou usando a versão mais recente do Eclipse, 2025-03, 4.35
Os coletores não são mais um recurso de visualização no Java 24. O problema é que você está usando um lambda não compatível.
Gatherer é uma interface funcional, mas o único método que você deve implementar é
integrator()
. Isso não requer argumentos. O integrador em si também pode ser definido como um lambda e leva não 2, mas 3 argumentos: o estado intermediário, o elemento e o downstream. Em outras palavras (e já que o estado intermediário não é usado, vamos deixar isso claro usando_
):Ligeiramente melhorado para fazer melhor uso de um possível
false
retorno dedownstream.push
(não há necessidade de enviar se o downstream não quiser mais dados):Agora, isso não fica bonito com o lambda aninhado, então eu usaria o método de fábrica estático:
(Observe que não estou usando
Integrator.of
porque não vejo muita utilidade nisso aqui. Também não estou tornando o integrador ganancioso porque ele simplesmente não precisa ser.)flatMapToInt()
Embora stream gatherers sejam ótimos e resolvam muitos problemas, no seu caso em particular você obtém um código mais claro quando não os usa. Assim como não devemos streamificar tudo, também não devemos gatherificar todas as operações de stream.
Saída:
Para suas strings específicas
String::chars
funcionaria da mesma forma queString::codePoints
. Eu escolhi o último para levar todos os caracteres Unicode em conta. Para imprimir um ponto de código, eu usoCharacter.toChars()
para converter para um array dechar
valores (no nosso caso, um array de apenas 1char
). O sobrecarregadoSystem.out.println(char[])
então imprime o símbolo.Se você tiver um motivo para obter um fluxo de
Character
objetos, você precisa usarString::chars
:A saída é a mesma de antes.
Como a biblioteca não oferece nenhum
CharStream
tipo,chars()
(comocodePoints()
) retornaIntStream
. No último snippet, convertemos de primitivoint
paraCharacter
objetos usando.mapToObj(ch -> (char) ch)
e autoboxing.