Куративная коллекция полезных маленьких функций Java 8, которые вы можете быстро понять.
chunkcountOccurrencesdeepFlattendifferencedifferenceWithdistinctValuesOfArraydropElementsdropRighteveryNthfilterNonUniqueflattenflattenDepthgroupByheadinitialinitializeArrayWithRangeinitializeArrayWithValuesintersectionisSortedjoinnthElementpickreducedFilterremovesamplesampleSizeshufflesimilaritysortedIndexsymmetricDifferencetailtaketakeRightunionwithoutzipzipObjectaveragegcdlcmfindNextPositivePowerOfTwoisEvenisPowerOfTwogenerateRandomIntanagramsbyteSizecapitalizecapitalizeEveryWordcountVowelsescapeRegExpfromCamelCaseisAbsoluteURLisLowerCaseisUpperCaseisPalindromeisNumericmaskreverseStringsortCharactersInStringsplitLinestoCamelCasetoKebabCasematchtoSnakeCasetruncateStringwordsstringToIntegersconvertInputStreamToStringreadFileAsStringgetCurrentWorkingDirectoryPathtmpDirNamestackTraceAsStringosNameisDebuggerEnabledgetAllInterfacesIsInnerClassgetEnumMapКусочки массивы в меньшие массивы указанного размера.
public static int [][] chunk ( int [] numbers , int size ) {
return IntStream . iterate ( 0 , i -> i + size )
. limit (( long ) Math . ceil (( double ) numbers . length / size ))
. mapToObj ( cur -> Arrays . copyOfRange ( numbers , cur , cur + size > numbers . length ? numbers . length : cur + size ))
. toArray ( int [][]:: new );
} public static < T > T [] concat ( T [] first , T [] second ) {
return Stream . concat (
Stream . of ( first ),
Stream . of ( second )
). toArray ( i -> ( T []) Arrays . copyOf ( new Object [ 0 ], i , first . getClass ()));
}Подсчитывает случаи значения в массиве.
Используйте Arrays.stream (). Filter (). Count () для подсчета общего количества значений, которые равны указанному значению.
public static long countOccurrences ( int [] numbers , int value ) {
return Arrays . stream ( numbers )
. filter ( number -> number == value )
. count ();
}Глубокий сглаживает массив.
Используйте рекурсию. Используйте Arrays.stream (). Flatmaptoint ()
public static int [] deepFlatten ( Object [] input ) {
return Arrays . stream ( input )
. flatMapToInt ( o -> {
if ( o instanceof Object []) {
return Arrays . stream ( deepFlatten (( Object []) o ));
}
return IntStream . of (( Integer ) o );
}). toArray ();
}Возвращает разницу между двумя массивами.
Создайте набор из B, затем используйте Arrays.Stream (). Filter () на A, чтобы сохранить только значения, не содержащиеся в b.
public static int [] difference ( int [] first , int [] second ) {
Set < Integer > set = Arrays . stream ( second ). boxed (). collect ( Collectors . toSet ());
return Arrays . stream ( first )
. filter ( v -> ! set . contains ( v ))
. toArray ();
}Отфильтруйте все значения из массива, для которого функция компаратора не возвращает true.
Кораптор для INT реализован с использованием функции IntbinaryPerator.
Использует Arrays.Stream (). Filter и Arrays.Stream (). Nonematch (), чтобы найти соответствующие значения.
public static int [] differenceWith ( int [] first , int [] second , IntBinaryOperator comparator ) {
return Arrays . stream ( first )
. filter ( a ->
Arrays . stream ( second )
. noneMatch ( b -> comparator . applyAsInt ( a , b ) == 0 )
). toArray ();
}Возвращает все различные значения массива.
Использует Arrays.Stream (). Disful (), чтобы отказаться от всех дублированных значений.
public static int [] distinctValuesOfArray ( int [] elements ) {
return Arrays . stream ( elements ). distinct (). toArray ();
}Удаляет элементы в массиве до тех пор, пока не вернет функцию, которую не вернется. Возвращает оставшиеся элементы в массиве.
Проверьте массив, используя Arrays.copyOfrange (), чтобы отбросить первый элемент массива, пока возвращаемое значение из функции не станет истинной. Возвращает оставшиеся элементы.
public static int [] dropElements ( int [] elements , IntPredicate condition ) {
while ( elements . length > 0 && ! condition . test ( elements [ 0 ])) {
elements = Arrays . copyOfRange ( elements , 1 , elements . length );
}
return elements ;
}Возвращает новый массив с n элементами, удаленными справа.
Проверьте, является ли n короче данного массива, и используйте Array.copyofrange (), чтобы соответствующим образом нарезать его или вернуть пустой массив.
public static int [] dropRight ( int [] elements , int n ) {
if ( n < 0 ) {
throw new IllegalArgumentException ( "n is less than 0" );
}
return n < elements . length
? Arrays . copyOfRange ( elements , 0 , elements . length - n )
: new int [ 0 ];
}Возвращает каждый n -й элемент в массиве.
Используйте intstream.range (). Filter (), чтобы создать новый массив, который содержит каждый n -й элемент данного массива.
public static int [] everyNth ( int [] elements , int nth ) {
return IntStream . range ( 0 , elements . length )
. filter ( i -> i % nth == nth - 1 )
. map ( i -> elements [ i ])
. toArray ();
}Найдите индекс элемента в массиве. Возврат -1 в случае, если элемент не существует.
Использует intstream.range (). Filter () для поиска индекса элемента в массиве.
public static int indexOf ( int [] elements , int el ) {
return IntStream . range ( 0 , elements . length )
. filter ( idx -> elements [ idx ] == el )
. findFirst ()
. orElse (- 1 );
}Найдите последний показатель элемента в массиве. Возврат -1 в случае, если элемент не существует.
Использует intstream.iterate (). Limit (). Filter () для поиска индекса элемента в массиве.
public static int lastIndexOf ( int [] elements , int el ) {
return IntStream . iterate ( elements . length - 1 , i -> i - 1 )
. limit ( elements . length )
. filter ( idx -> elements [ idx ] == el )
. findFirst ()
. orElse (- 1 );
}Отфильтруйте некноязычные значения в массиве.
Используйте Arrays.stream (). Filter () для массива, содержащего только уникальные значения.
public static int [] filterNonUnique ( int [] elements ) {
return Arrays . stream ( elements )
. filter ( el -> indexOf ( elements , el ) == lastIndexOf ( elements , el ))
. toArray ();
}Платает массив.
Используйте Arrays.stream (). Flatmaptoint (). Toarray (), чтобы создать новый массив.
public static int [] flatten ( Object [] elements ) {
return Arrays . stream ( elements )
. flatMapToInt ( el -> el instanceof int []
? Arrays . stream (( int []) el )
: IntStream . of (( int ) el )
). toArray ();
}Снижает массив до указанной глубины.
public static Object [] flattenDepth ( Object [] elements , int depth ) {
if ( depth == 0 ) {
return elements ;
}
return Arrays . stream ( elements )
. flatMap ( el -> el instanceof Object []
? Arrays . stream ( flattenDepth (( Object []) el , depth - 1 ))
: Arrays . stream ( new Object []{ el })
). toArray ();
}Группируют элементы массива на основе данной функции.
Использует Arrays.Stream (). Collect (Collectors.GroupingBy ()) для группы на основе функции группировки.
public static < T , R > Map < R , List < T >> groupBy ( T [] elements , Function < T , R > func ) {
return Arrays . stream ( elements ). collect ( Collectors . groupingBy ( func ));
}Возвращает все элементы массива, кроме последнего. Используйте Arrays.copyofrange (), чтобы вернуть все, кроме последнего
public static < T > T [] initial ( T [] elements ) {
return Arrays . copyOfRange ( elements , 0 , elements . length - 1 );
}Инициализирует массив, содержащий числа в указанном диапазоне, где начало и конец включены.
public static int [] initializeArrayWithRange ( int end , int start ) {
return IntStream . rangeClosed ( start , end ). toArray ();
}Инициализирует и заполняет массив с указанными значениями.
public static int [] initializeArrayWithValues ( int n , int value ) {
return IntStream . generate (() -> value ). limit ( n ). toArray ();
}Возвращает список элементов, которые существуют в обоих массивах.
Создайте набор с секунды, затем используйте Arrays.stream (). Filter () на a, чтобы сохранить только значения, содержащиеся в b.
public static int [] intersection ( int [] first , int [] second ) {
Set < Integer > set = Arrays . stream ( second ). boxed (). collect ( Collectors . toSet ());
return Arrays . stream ( first )
. filter ( set :: contains )
. toArray ();
} Возврат 1 если массив сортируется в порядке возрастания, -1 если он сортируется в порядке убывания или 0 , если он не отсортирован.
Рассчитайте direction заказа для первых двух элементов. Используйте цикл для итерации по элементам массива и сравните их парами. Верните 0 если direction изменяется или direction если достигнут последний элемент.
public static < T extends Comparable <? super T >> int isSorted ( T [] arr ) {
final int direction = arr [ 0 ]. compareTo ( arr [ 1 ]) < 0 ? 1 : - 1 ;
for ( int i = 0 ; i < arr . length ; i ++) {
T val = arr [ i ];
if ( i == arr . length - 1 ) return direction ;
else if (( val . compareTo ( arr [ i + 1 ]) * direction > 0 )) return 0 ;
}
return direction ;
}Присоединяет все элементы массива в строку и возвращает эту строку. Использует сепаратор и конечный сепаратор.
Используйте intstream.range для zip index с элементом массива. Затем используйте Stream.reduce , чтобы объединить элементы в строку.
public static < T > String join ( T [] arr , String separator , String end ) {
return IntStream . range ( 0 , arr . length )
. mapToObj ( i -> new SimpleEntry <>( i , arr [ i ]))
. reduce ( "" , ( acc , val ) -> val . getKey () == arr . length - 2
? acc + val . getValue () + end
: val . getKey () == arr . length - 1 ? acc + val . getValue () : acc + val . getValue () + separator , ( fst , snd ) -> fst );
}Возвращает n -й элемент массива.
Используйте Arrays.copyOfRange() , чтобы получить массив, содержащий NTH -элемент в первую очередь.
public static < T > T nthElement ( T [] arr , int n ) {
if ( n > 0 ) {
return Arrays . copyOfRange ( arr , n , arr . length )[ 0 ];
}
return Arrays . copyOfRange ( arr , arr . length + n , arr . length )[ 0 ];
}Выбирает пары клавиш, соответствующие данным клавишам из объекта.
Используйте Arrays.stream , чтобы отфильтровать все ключи, которые присутствуют в arr . Затем преобразуйте все клавиши, присутствующие в карту, используя Collectors.toMap .
public static < T , R > Map < T , R > pick ( Map < T , R > obj , T [] arr ) {
return Arrays . stream ( arr )
. filter ( obj :: containsKey )
. collect ( Collectors . toMap ( k -> k , obj :: get ));
}Отфильтруйте массив объектов на основе условия, а также фильтрации неопределенных ключей.
Используйте Arrays.stream().filter() , чтобы фильтровать массив на основе предиката fn , чтобы он возвращал объекты, для которых условие является истинным. Для каждого фильтрованного объекта карты создайте новую карту с ключами, присутствующими в keys . Наконец, соберите весь объект карты в массив.
public static Map < String , Object >[] reducedFilter ( Map < String , Object >[] data , String [] keys , Predicate < Map < String , Object >> fn ) {
return Arrays . stream ( data )
. filter ( fn )
. map ( el -> Arrays . stream ( keys ). filter ( el :: containsKey )
. collect ( Collectors . toMap ( Function . identity (), el :: get )))
. toArray (( IntFunction < Map < String , Object >[]>) Map []:: new );
}Возвращает случайный элемент из массива.
Используйте Math.random() , чтобы генерировать случайное число, умножьте его на length и округлую его до ближайшего всего числа, используя Math.floor() . Этот метод также работает со строками.
public static < T > T sample ( T [] arr ) {
return arr [( int ) Math . floor ( Math . random () * arr . length )];
} Получает n случайных элементов в уникальных ключах от array до размера array .
Пересаживайте массив, используя алгоритм Fisher-Yates. Используйте Array.copyOfRange() , чтобы получить первые n -элементы.
public static < T > T [] sampleSize ( T [] input , int n ) {
T [] arr = Arrays . copyOf ( input , input . length );
int length = arr . length ;
int m = length ;
while ( m > 0 ) {
int i = ( int ) Math . floor ( Math . random () * m --);
T tmp = arr [ i ];
arr [ i ] = arr [ m ];
arr [ m ] = tmp ;
}
return Arrays . copyOfRange ( arr , 0 , n > length ? length : n );
}Рандомизирует порядок значений массива, возвращая новый массив.
Использует алгоритм Fisher-Yates для переупорядочения элементов массива.
public static < T > T [] shuffle ( T [] input ) {
T [] arr = Arrays . copyOf ( input , input . length );
int length = arr . length ;
int m = length ;
while ( m > 0 ) {
int i = ( int ) Math . floor ( Math . random () * m --);
T tmp = arr [ i ];
arr [ i ] = arr [ m ];
arr [ m ] = tmp ;
}
return arr ;
}Возвращает множество элементов, которые появляются в обоих массивах.
Используйте Arrays.stream().filter() , чтобы удалить значения, которые не являются частью second , определяются с использованием Arrays.stream().anyMatch() .
public static < T > T [] similarity ( T [] first , T [] second ) {
return Arrays . stream ( first )
. filter ( a -> Arrays . stream ( second ). anyMatch ( b -> Objects . equals ( a , b )))
// Make a new array of first's runtime type, but empty content:
. toArray ( i -> ( T []) Arrays . copyOf ( new Object [ 0 ], i , first . getClass ()));
}Возвращает самый низкий индекс, при котором значение должно быть вставлено в массив, чтобы поддерживать его сортировку.
Проверьте, отсортирован ли массив в порядке убывания (свободно). Используйте IntStream.range().filter() чтобы найти соответствующий индекс, в который должен быть вставлен элемент.
public static < T extends Comparable <? super T >> int sortedIndex ( T [] arr , T el ) {
boolean isDescending = arr [ 0 ]. compareTo ( arr [ arr . length - 1 ]) > 0 ;
return IntStream . range ( 0 , arr . length )
. filter ( i -> isDescending ? el . compareTo ( arr [ i ]) >= 0 : el . compareTo ( arr [ i ]) <= 0 )
. findFirst ()
. orElse ( arr . length );
}Возвращает симметричную разницу между двумя массивами.
Создайте Set из каждого массива, затем используйте Arrays.stream().filter() на каждом из них, чтобы сохранить только значения, не содержащиеся в другом. Наконец, объединить оба массива, создать новый массив и вернуть его.
public static < T > T [] symmetricDifference ( T [] first , T [] second ) {
Set < T > sA = new HashSet <>( Arrays . asList ( first ));
Set < T > sB = new HashSet <>( Arrays . asList ( second ));
return Stream . concat (
Arrays . stream ( first ). filter ( a -> ! sB . contains ( a )),
Arrays . stream ( second ). filter ( b -> ! sA . contains ( b ))
). toArray ( i -> ( T []) Arrays . copyOf ( new Object [ 0 ], i , first . getClass ()));
}Возвращает все элементы в массиве, за исключением первого.
Return Arrays.copyOfRange(1) Если length массива составляет более 1 , в противном случае верните весь массив.
public static < T > T [] tail ( T [] arr ) {
return arr . length > 1
? Arrays . copyOfRange ( arr , 1 , arr . length )
: arr ;
}Возвращает массив с n элементами, удаленными с самого начала.
public static < T > T [] take ( T [] arr , int n ) {
return Arrays . copyOfRange ( arr , 0 , n );
}Возвращает массив с n элементами, удаленными с конца.
Используйте Arrays.copyOfRange() , чтобы создать ломтик массива с n элементами, взятыми с конца.
public static < T > T [] takeRight ( T [] arr , int n ) {
return Arrays . copyOfRange ( arr , arr . length - n , arr . length );
}Возвращает каждый элемент, который существует в любом из двух массивов один раз.
Создайте Set со всеми значениями a и b и преобразуйте в массив.
public static < T > T [] union ( T [] first , T [] second ) {
Set < T > set = new HashSet <>( Arrays . asList ( first ));
set . addAll ( Arrays . asList ( second ));
return set . toArray (( T []) Arrays . copyOf ( new Object [ 0 ], 0 , first . getClass ()));
}Отфильтруйте элементы массива, которые имеют одно из указанных значений.
Используйте Arrays.strean().filter() , чтобы создать массив, исключая (используя !Arrays.asList(elements).contains() ) все данные значения.
public static < T > T [] without ( T [] arr , T ... elements ) {
List < T > excludeElements = Arrays . asList ( elements );
return Arrays . stream ( arr )
. filter ( el -> ! excludeElements . contains ( el ))
. toArray ( i -> ( T []) Arrays . copyOf ( new Object [ 0 ], i , arr . getClass ()));
}Создает множество элементов, сгруппированных на основе позиции в исходных массивах.
public static List < Object []> zip ( Object []... arrays ) {
OptionalInt max = Arrays . stream ( arrays ). mapToInt ( arr -> arr . length ). max ();
return IntStream . range ( 0 , max . getAsInt ())
. mapToObj ( i -> Arrays . stream ( arrays )
. map ( arr -> i < arr . length ? arr [ i ] : null )
. toArray ())
. collect ( Collectors . toList ());
}Учитывая массив допустимых идентификаторов свойств и массив значений, верните объект, связывающий свойства с значениями.
public static Map < String , Object > zipObject ( String [] props , Object [] values ) {
return IntStream . range ( 0 , props . length )
. mapToObj ( i -> new SimpleEntry <>( props [ i ], i < values . length ? values [ i ] : null ))
. collect (
HashMap :: new , ( m , v ) -> m . put ( v . getKey (), v . getValue ()), HashMap :: putAll );
}Возвращает среднее из двух или более чисел.
public static double average ( int [] arr ) {
return IntStream . of ( arr )
. average ()
. orElseThrow (() -> new IllegalArgumentException ( "Array is empty" ));
}Вычисляет наибольший общий знаменатель (GCD) массива чисел.
Используйте Arrays.stream (). Cream () и формула GCD (использует рекурсию), чтобы вычислить наибольший общий знаменатель массива чисел.
public static OptionalInt gcd ( int [] numbers ) {
return Arrays . stream ( numbers )
. reduce (( a , b ) -> gcd ( a , b ));
}
private static int gcd ( int a , int b ) {
if ( b == 0 ) {
return a ;
}
return gcd ( b , a % b );
}Вычисляет самое низкое распространенное множественное (LCM) массива чисел.
Используйте Arrays.Stream (). Cream () и формула LCM (использует рекурсию), чтобы вычислить самое низкое общее кратное массив чисел.
public static OptionalInt lcm ( int [] numbers ) {
IntBinaryOperator lcm = ( x , y ) -> ( x * y ) / gcd ( x , y );
return Arrays . stream ( numbers )
. reduce (( a , b ) -> lcm . applyAsInt ( a , b ));
}
private static int gcd ( int a , int b ) {
if ( b == 0 ) {
return a ;
}
return gcd ( b , a % b );
}Находит следующую силу двух больше или равна значению.
Этот метод использует оператор левого корабля для сдвига 1 по значению на правой стороне. Правая сторона рассчитывается с использованием метода Integer.numberOfLeadingZeros .
Integer.numberOfLeadingZeros дает количество нулей, ведущих значение. Например, вызов Integer.numberOfLeadingZeros(3) даст ценность 30. Это потому, что 3 представлено в двоичном языке как 11 . Поскольку целое число имеет 32 бита, так что существует 30 бит с 0. Правая сторона оператора левой сдвига становится 32-30 = 2 . Левое смещение 1 на 2 т.е. 001 << 2 будет 100 . 100 в десятичном виде равны 4 .
public static int findNextPositivePowerOfTwo ( int value ) {
return 1 << ( 32 - Integer . numberOfLeadingZeros ( value - 1 ));
}Проверьте, является ли номер ровный.
Этот метод использует бить и оператор. 0b1 - это двоичное представление 1. Поскольку Java 7 вы можете написать бинарные литералы, префикс их с 0b или 0B . Оператор и оператор вернет 0, когда номер будет ровным. Например, IsEven(4) приведет к 100 & 001 . Результат & будет 000 .
public static boolean isEven ( final int value ) {
return ( value & 0b1) == 0 ;
}Проверяет, является ли значение положительной мощностью двух.
Чтобы понять, как это работает, давайте предположим, что мы сделали звонок IsPowerOfTwo(4) .
Поскольку значение больше 0, поэтому будет оценена правая сторона оператора && .
Результат (~value + 1) равен самому значению. ~100 + 001 => 011 + 001 => 100 . Это равно значению.
Результатом (value & value) является значение. 100 и 100 => 100 .
Это будет ценить выражение до TRUE, поскольку значение равно значению.
public static boolean isPowerOfTwo ( final int value ) {
return value > 0 && (( value & (~ value + 1 )) == value );
} Создайте случайное целое число между Integer.MIN_VALUE и Integer.MAX_VALUE .
public static int generateRandomInt () {
return ThreadLocalRandom . current (). nextInt ();
}Генерирует все анаграммы строки (содержит дубликаты).
public static List < String > anagrams ( String input ) {
if ( input . length () <= 2 ) {
return input . length () == 2
? Arrays . asList ( input , input . substring ( 1 ) + input . substring ( 0 , 1 ))
: Collections . singletonList ( input );
}
return IntStream . range ( 0 , input . length ())
. mapToObj ( i -> new SimpleEntry <>( i , input . substring ( i , i + 1 )))
. flatMap ( entry ->
anagrams ( input . substring ( 0 , entry . getKey ()) + input . substring ( entry . getKey () + 1 ))
. stream ()
. map ( s -> entry . getValue () + s ))
. collect ( Collectors . toList ());
}Возвращает длину струны в байтах.
public static int byteSize ( String input ) {
return input . getBytes (). length ;
}Капитализирует первую букву строки.
public static String capitalize ( String input , boolean lowerRest ) {
return input . substring ( 0 , 1 ). toUpperCase () +
( lowerRest
? input . substring ( 1 , input . length ()). toLowerCase ()
: input . substring ( 1 , input . length ()));
}Капитализирует первую букву каждого слова в строке.
public static String capitalizeEveryWord ( final String input ) {
return Pattern . compile ( " \ b(?= \ w)" ). splitAsStream ( input )
. map ( w -> capitalize ( w , false ))
. collect ( Collectors . joining ());
} Повторный number гласных в предоставленной строке.
public static int countVowels ( String input ) {
return input . replaceAll ( "[^aeiouAEIOU]" , "" ). length ();
}Убегает по строке, чтобы использовать в регулярном выражении.
public static String escapeRegExp ( String input ) {
return Pattern . quote ( input );
}Преобразует строку из Camelcase.
public static String fromCamelCase ( String input , String separator ) {
return input
. replaceAll ( "([a-z \ d])([A-Z])" , "$1" + separator + "$2" )
. toLowerCase ();
} Возвращает true если данная строка является абсолютным URL, false в противном случае.
public static boolean isAbsoluteUrl ( String url ) {
return Pattern . compile ( "^[a-z][a-z0-9+.-]*:" ). matcher ( url ). find ();
}Проверяет, является ли строка более низким корпусом.
public static boolean isLowerCase ( String input ) {
return Objects . equals ( input , input . toLowerCase ());
}Проверяет, является ли строка верхнего чехла.
public static boolean isUpperCase ( String input ) {
return Objects . equals ( input , input . toUpperCase ());
}Проверяет, является ли строка палиндром.
public static boolean isPalindrome ( String input ) {
String s = input . toLowerCase (). replaceAll ( "[ \ W_]" , "" );
return Objects . equals (
s ,
new StringBuilder ( s ). reverse (). toString ()
);
}Проверяет, численная строка.
public static boolean isNumeric ( final String input ) {
return IntStream . range ( 0 , input . length ())
. allMatch ( i -> Character . isDigit ( input . charAt ( i )));
} Заменяет все, кроме последнего num символов с указанным символом маски.
public static String mask ( String input , int num , String mask ) {
int length = input . length ();
return num > 0
?
input . substring ( 0 , length - num ). replaceAll ( "." , mask )
+ input . substring ( length - num )
:
input . substring ( 0 , Math . negateExact ( num ))
+ input . substring ( Math . negateExact ( num ), length ). replaceAll ( "." , mask );
}Переворачивает строку.
public static String reverseString ( String input ) {
return new StringBuilder ( input ). reverse (). toString ();
}Алфавитно сортирует символы в строке.
public static String sortCharactersInString ( String input ) {
return Arrays . stream ( input . split ( "" )). sorted (). collect ( Collectors . joining ());
}Разбивает многослойную строку в массив строк.
public static String [] splitLines ( String input ) {
return input . split ( " \ r? \ n" );
}Преобразует строку в Camelcase.
public static String toCamelCase ( String input ) {
Matcher matcher = Pattern . compile ( "[A-Z]{2,}(?=[A-Z][a-z]+[0-9]*| \ b)|[A-Z]?[a-z]+[0-9]*|[A-Z]|[0-9]+" ). matcher ( input );
List < String > matchedParts = new ArrayList <>();
while ( matcher . find ()) {
matchedParts . add ( matcher . group ( 0 ));
}
String s = matchedParts . stream ()
. map ( x -> x . substring ( 0 , 1 ). toUpperCase () + x . substring ( 1 ). toLowerCase ())
. collect ( Collectors . joining ());
return s . substring ( 0 , 1 ). toLowerCase () + s . substring ( 1 );
}Преобразует строку в корпус Kebab.
public static String toKebabCase ( String input ) {
Matcher matcher = Pattern . compile ( "[A-Z]{2,}(?=[A-Z][a-z]+[0-9]*| \ b)|[A-Z]?[a-z]+[0-9]*|[A-Z]|[0-9]+" ). matcher ( input );
List < String > matchedParts = new ArrayList <>();
while ( matcher . find ()) {
matchedParts . add ( matcher . group ( 0 ));
}
return matchedParts . stream ()
. map ( String :: toLowerCase )
. collect ( Collectors . joining ( "-" ));
} public static List < String > match ( String input , String regex ) {
Matcher matcher = Pattern . compile ( regex ). matcher ( input );
List < String > matchedParts = new ArrayList <>();
while ( matcher . find ()) {
matchedParts . add ( matcher . group ( 0 ));
}
return matchedParts ;
}Преобразует строку в корпус змеи.
public static String toSnakeCase ( String input ) {
Matcher matcher = Pattern . compile ( "[A-Z]{2,}(?=[A-Z][a-z]+[0-9]*| \ b)|[A-Z]?[a-z]+[0-9]*|[A-Z]|[0-9]+" ). matcher ( input );
List < String > matchedParts = new ArrayList <>();
while ( matcher . find ()) {
matchedParts . add ( matcher . group ( 0 ));
}
return matchedParts . stream ()
. map ( String :: toLowerCase )
. collect ( Collectors . joining ( "_" ));
}Усекает строку до указанной длины.
public static String truncateString ( String input , int num ) {
return input . length () > num
? input . substring ( 0 , num > 3 ? num - 3 : num ) + "..."
: input ;
}Преобразует данную строку в массив слов.
public static String [] words ( String input ) {
return Arrays . stream ( input . split ( "[^a-zA-Z-]+" ))
. filter ( s -> ! s . isEmpty ())
. toArray ( String []:: new );
}Преобразует строку чисел, разделенных пространством в массив INT.
public static int [] stringToIntegers ( String numbers ) {
return Arrays . stream ( numbers . split ( " " )). mapToInt ( Integer :: parseInt ). toArray ();
}Преобразует inputstream в строку.
public static String convertInputStreamToString ( final InputStream in ) throws IOException {
ByteArrayOutputStream result = new ByteArrayOutputStream ();
byte [] buffer = new byte [ 1024 ];
int length ;
while (( length = in . read ( buffer )) != - 1 ) {
result . write ( buffer , 0 , length );
}
return result . toString ( StandardCharsets . UTF_8 . name ());
}Считывает содержимое файла в строку
public String readFileAsString ( Path path ) throws IOException {
return new String ( Files . readAllBytes ( path ));
} public static String getCurrentWorkingDirectoryPath () {
return FileSystems . getDefault (). getPath ( "" ). toAbsolutePath (). toString ();
} Возвращает значение свойства системы java.io.tmpdir . Он добавляет сепаратор, если не присутствует в конце.
public static String tmpDirName () {
String tmpDirName = System . getProperty ( "java.io.tmpdir" );
if (! tmpDirName . endsWith ( File . separator )) {
tmpDirName += File . separator ;
}
return tmpDirName ;
}Преобразует трассировку стека исключений в строку.
public static String stackTraceAsString ( final Throwable throwable ) {
final StringWriter sw = new StringWriter ();
throwable . printStackTrace ( new PrintWriter ( sw ));
return sw . toString ();
}Получает имя операционной системы в качестве строки более низкого регистра.
public static String osName () {
return System . getProperty ( "os.name" ). toLowerCase ();
}Проверки, если отладчик прикреплен к JVM.
public static boolean isDebuggerAttached () {
final RuntimeMXBean runtimeMXBean = ManagementFactory . getRuntimeMXBean ();
return runtimeMXBean . getInputArguments ()
. stream ()
. anyMatch ( arg -> arg . contains ( "-agentlib:jdwp" ));
}Эти методы возвращает все интерфейсы, реализованные данным классом и его суперклассами.
Этот метод работает, объединив два потока. Первый поток рекурсивно создан путем создания потока с интерфейсом и всеми интерфейсами, реализованными интерфейсом. Второй поток делает то же самое для супер -классов. Результатом является объединение двух потоков после удаления дубликатов.
public static List < Class <?>> getAllInterfaces ( Class <?> cls ) {
return Stream . concat (
Arrays . stream ( cls . getInterfaces ()). flatMap ( intf ->
Stream . concat ( Stream . of ( intf ), getAllInterfaces ( intf ). stream ())),
cls . getSuperclass () == null ? Stream . empty () : getAllInterfaces ( cls . getSuperclass ()). stream ()
). distinct (). collect ( Collectors . toList ());
}Этот метод проверяет, является ли указанный класс внутренним классом или статическим вложенным классом
public static boolean isInnerClass ( final Class <?> cls ) {
return cls != null && cls . getEnclosingClass () != null ;
}Преобразует в перечисление в карту, где клавиша - это имя, а значение - сама перечисление.
public static < E extends Enum < E >> Map < String , E > getEnumMap ( final Class < E > enumClass ) {
return Arrays . stream ( enumClass . getEnumConstants ())
. collect ( Collectors . toMap ( Enum :: name , Function . identity ()));
}Этот проект начался как ява-вилка из 30 секунд кода. Спасибо сотрудникам проекта за усилия.