Mejora de la API Java Stream.
Esta biblioteca define cuatro clases: StreamEx
, IntStreamEx
, LongStreamEx
y DoubleStreamEx
que son totalmente compatibles con las clases de flujo de Java 8 y proporcionan muchos métodos adicionales útiles. Además, se proporciona la clase EntryStream
que representa un flujo de entradas de mapa y proporciona funcionalidad adicional para este caso. Finalmente, hay algunos recopiladores nuevos útiles definidos en la clase MoreCollectors
, así como el concepto de recopiladores primitivos.
La documentación API completa está disponible aquí.
¡Eche un vistazo a la hoja de referencia para obtener una breve introducción a StreamEx!
Antes de actualizar StreamEx, consulte las notas de migración y la lista completa de cambios.
Los puntos principales de StreamEx son los siguientes:
Métodos de acceso directo del recopilador (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"
Seleccionar elementos de flujo de un tipo específico
public List < Element > elementsOf ( NodeList nodeList ) {
return IntStreamEx . range ( nodeList . getLength ())
. mapToObj ( nodeList :: item ). select ( Element . class ). toList ();
}
Agregar elementos a una secuencia
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 ();
}
Eliminar elementos no deseados y usar una secuencia 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 ());
}
}
Seleccionar claves de mapa por predicado de valor:
Map < String , Role > nameToRole ;
public Set < String > getEnabledRoleNames () {
return StreamEx . ofKeys ( nameToRole , Role :: isEnabled ). toSet ();
}
Operando en pares clave-valor:
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 ();
}
Diferencias por pares:
DoubleStreamEx . of ( input ). pairMap (( a , b ) -> b - a ). toArray ();
Soporte para tipos byte/char/short/float:
short [] multiply ( short [] src , short multiplier ) {
return IntStreamEx . of ( src ). map ( x -> x * multiplier ). toShortArray ();
}
Defina una operación intermedia diferida personalizada de forma recursiva:
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 ));
}
¡Y más!
Este proyecto tiene la licencia Apache, versión 2.0.
Las versiones están disponibles en Maven Central
Antes de actualizar StreamEx, consulte las notas de migración y la lista completa de cambios.
Agregue este fragmento a la sección de dependencies
pom.xml de su proyecto:
< dependency >
< groupId >one.util</ groupId >
< artifactId >streamex</ artifactId >
< version >0.8.3</ version >
</ dependency >
Agregue este fragmento a la sección dependencies
build.gradle de su proyecto:
implementation ' one.util:streamex:0.8.3 '
Las solicitudes de extracción son bienvenidas.