Улучшение API Java Stream.
Эта библиотека определяет четыре класса: StreamEx
, IntStreamEx
, LongStreamEx
, DoubleStreamEx
, которые полностью совместимы с классами потоков Java 8 и предоставляют множество полезных дополнительных методов. Кроме того, предоставляется класс EntryStream
, который представляет поток записей карты и предоставляет дополнительную функциональность для этого случая. Наконец, в классе MoreCollectors
определены несколько полезных новых сборщиков, а также концепция примитивных сборщиков.
Полная документация по API доступна здесь.
Взгляните на шпаргалку для краткого ознакомления с StreamEx!
Перед обновлением StreamEx проверьте примечания по миграции и полный список изменений.
Основные моменты StreamEx следующие:
Методы быстрого доступа к сборщикам (toList, toSet, groupingBy, joining и т. д.)
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"
Выбор элементов потока определенного типа
public List < Element > elementsOf ( NodeList nodeList ) {
return IntStreamEx . range ( nodeList . getLength ())
. mapToObj ( nodeList :: item ). select ( Element . class ). toList ();
}
Добавление элементов в поток
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 ();
}
Удаление ненужных элементов и использование потока в качестве 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 ());
}
}
Выбор ключей карты по предикату значения:
Map < String , Role > nameToRole ;
public Set < String > getEnabledRoleNames () {
return StreamEx . ofKeys ( nameToRole , Role :: isEnabled ). toSet ();
}
Работаем с парами ключ-значение:
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 ();
}
Парные различия:
DoubleStreamEx . of ( input ). pairMap (( a , b ) -> b - a ). toArray ();
Поддержка типов byte/char/short/float:
short [] multiply ( short [] src , short multiplier ) {
return IntStreamEx . of ( src ). map ( x -> x * multiplier ). toShortArray ();
}
Рекурсивно определите пользовательскую ленивую промежуточную операцию:
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 ));
}
И многое другое!
Этот проект распространяется по лицензии Apache версии 2.0.
Релизы доступны в Maven Central.
Перед обновлением StreamEx проверьте примечания по миграции и полный список изменений.
Добавьте этот фрагмент в раздел dependencies
pom.xml вашего проекта:
< dependency >
< groupId >one.util</ groupId >
< artifactId >streamex</ artifactId >
< version >0.8.3</ version >
</ dependency >
Добавьте этот фрагмент в раздел dependencies
build.gradle вашего проекта:
implementation ' one.util:streamex:0.8.3 '
Запросы на вытягивание приветствуются.