Aprimorando a API Java Stream.
Esta biblioteca define quatro classes: StreamEx
, IntStreamEx
, LongStreamEx
, DoubleStreamEx
que são totalmente compatíveis com as classes de fluxo Java 8 e fornecem muitos métodos adicionais úteis. Além disso, é fornecida a classe EntryStream
, que representa um fluxo de entradas do mapa e fornece funcionalidade adicional para este caso. Finalmente, existem alguns novos coletores úteis definidos na classe MoreCollectors
, bem como o conceito de coletores primitivos.
A documentação completa da API está disponível aqui.
Dê uma olhada no Cheatsheet para uma breve introdução ao StreamEx!
Antes de atualizar o StreamEx verifique as notas de migração e a lista completa de alterações.
Os pontos principais do StreamEx são os seguintes:
Métodos de atalho do coletor (toList, toSet, groupingBy, join, etc.)
List < String > userNames = StreamEx . of ( users ). map ( User :: getName ). toList ();
Map < Role , List < User >> role2users = StreamEx . of ( users ). groupingBy ( User :: getRole );
StreamEx . of ( 1 , 2 , 3 ). joining ( "; " ); // "1; 2; 3"
Selecionando elementos de fluxo de um tipo específico
public List < Element > elementsOf ( NodeList nodeList ) {
return IntStreamEx . range ( nodeList . getLength ())
. mapToObj ( nodeList :: item ). select ( Element . class ). toList ();
}
Adicionando elementos a um fluxo
public List < String > getDropDownOptions () {
return StreamEx . of ( users ). map ( User :: getName ). prepend ( "(none)" ). toList ();
}
public int [] addValue ( int [] arr , int value ) {
return IntStreamEx . of ( arr ). append ( value ). toArray ();
}
Removendo elementos indesejados e usando um stream como Iterable:
public void copyNonEmptyLines ( Reader reader , Writer writer ) throws IOException {
for ( String line : StreamEx . ofLines ( reader ). remove ( String :: isEmpty )) {
writer . write ( line );
writer . write ( System . lineSeparator ());
}
}
Selecionando chaves de mapa por predicado de valor:
Map < String , Role > nameToRole ;
public Set < String > getEnabledRoleNames () {
return StreamEx . ofKeys ( nameToRole , Role :: isEnabled ). toSet ();
}
Operando em pares de valores-chave:
public Map < String , List < String >> invert ( Map < String , List < String >> map ) {
return EntryStream . of ( map ). flatMapValues ( List :: stream ). invert (). grouping ();
}
public Map < String , String > stringMap ( Map < Object , Object > map ) {
return EntryStream . of ( map ). mapKeys ( String :: valueOf )
. mapValues ( String :: valueOf ). toMap ();
}
Map < String , Group > nameToGroup ;
public Map < String , List < User >> getGroupMembers ( Collection < String > groupNames ) {
return StreamEx . of ( groupNames ). mapToEntry ( nameToGroup :: get )
. nonNullValues (). mapValues ( Group :: getMembers ). toMap ();
}
Diferenças entre pares:
DoubleStreamEx . of ( input ). pairMap (( a , b ) -> b - a ). toArray ();
Suporte para tipos byte/char/short/float:
short [] multiply ( short [] src , short multiplier ) {
return IntStreamEx . of ( src ). map ( x -> x * multiplier ). toShortArray ();
}
Defina uma operação intermediária lenta personalizada recursivamente:
static < T > StreamEx < T > scanLeft ( StreamEx < T > input , BinaryOperator < T > operator ) {
return input . headTail (( head , tail ) -> scanLeft ( tail . mapFirst ( cur -> operator . apply ( head , cur )), operator )
. prepend ( head ));
}
E mais!
Este projeto está licenciado sob Licença Apache, versão 2.0
As versões estão disponíveis no Maven Central
Antes de atualizar o StreamEx verifique as notas de migração e a lista completa de alterações.
Adicione este snippet à seção dependencies
pom.xml do seu projeto:
< dependency >
< groupId >one.util</ groupId >
< artifactId >streamex</ artifactId >
< version >0.8.3</ version >
</ dependency >
Adicione este snippet à seção dependencies
build.gradle do seu projeto:
implementation ' one.util:streamex:0.8.3 '
Solicitações pull são bem-vindas.