Ajuda com suporte à streams Java 8
TL;DR
TotalCross 4.0.2 está reclamando que não encontra a classe jdkcompat.util.function.BiFunction
, requesitado para ser a compatibilidade com java.util.function.BiFunction
, sendo que existe a classe jdkcompat.util.function.BiFunction4D
no SDK.
Versão completa
Faz um tempo que precisamos usar as funcionalidades das streams do Java 8. Como a versão usada do TotalCross aqui na empresa (4.0.2) não tem o pacote java.util.stream
nem tampouco possui métodos default/static
de interface, resolvemos fazer nossa própria versão de Stream
. Para tal, criamos a biblioteca totalcross-functional-toolbox
. Além da possibilidade de usar streams, também é possível usar os mônados que foram adicionados no Java 8 através do java.util.Optional
usando o br.com.softsite.toolbox.optional.Optional
. Nessa biblioteca também tem um conjunto de coisas funcionais que já usávamos na GeoSales e que chegamos à conclusão que deveria ser aberto.
Para demonstrar o uso, começamos um projeto de exemplo, o stream-support-totalcross-sample
. Para compilar o stream-support-totalcross-sample
, é necessário também compilar junto o totalcross-functional-toolbox
. Para tal, foi usado o gerenciador de builds TotalCross tc-compiler-help
. O build é feito entrando as informações corretas sobre a chave e o caminho do TotalCross instalado e, então, simplesmente chamando o Maven:
mvn clean package exec:java -Dexec.mainClass="br.com.softsite.streamsupport.CompileApp"
Esse tc-compiler-help
gerencia o all.pkg
para mim, então não preciso me preocupar em como devo fazer para lidar com as dependências, deixando a compilação do TotalCross mais próxima da gerência do ciclo de vida proporcionado por Maven, Gradle e Ivy.
Enfim, quando chegou a hora de rodar o teste, esbarrei no problema de que o TotalCross não reconheceu a classe java.util.function.BiFunction
, que internamente foi renomeada para jdkcompat.util.function.BiFunction
, sendo que há no SDK já a classe jdkcompat.util.function.BiFunction4D
. Eis o erro que o TotalCross lança a seguinte exceção ao tentar executar alguns dos métodos internos:
Ao tentar chamar diretamente a BiFunction
new Stream<>(hash.entrySet()).map(es -> es.getKey().toUpperCase() + " " + es.getKey().toUpperCase()).forEach(s -> {
BiFunction<String, Container, Label> f = (s1, c1) -> {
Label l = new Label(s1);
c1.add(l, LEFT, AFTER, FILL, PREFERRED);
return l;
};
f.apply(s, c);
});
o TotalCross roda tranquila e felimente:
Aparentemente, parece que o problema se encontra na hierarquia interna de BinaryOperator
. Creio que isso também ocorre com UnaryOperator
. Estou lançando uma versão de compatibilidade que não usa os *Operator
, mas as Function
adequadas.
Fiz uma nova versão removendo completamente às menções a BinaryOperator
e funcionou tranquilamente. Então, o problema todo se encontra ao tentar usar o BinaryOperator
no TotalCross, ele não reconhece corretamente a hierarquia da interface.