مجموعة برعاية من وظائف 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 ()));
}يحسب حوادث القيمة في صفيف.
استخدم المصفوفات.
public static long countOccurrences ( int [] numbers , int value ) {
return Arrays . stream ( numbers )
. filter ( number -> number == value )
. count ();
}يزحف عميق صفيف.
استخدم العودية. استخدم المصفوفات.
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 ، ثم استخدم المصفوفات.
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 ();
}تقوم بتصفية جميع القيم من صفيف لا تعود وظيفة المقارنة من أجلها.
يتم تنفيذ المقارنة لـ int باستخدام وظيفة intebinaryOperator.
يستخدم المصفوفات.
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 ();
}إرجاع جميع القيم المميزة للمصفوفة.
يستخدم المصفوفات.
public static int [] distinctValuesOfArray ( int [] elements ) {
return Arrays . stream ( elements ). distinct (). toArray ();
}يزيل العناصر في صفيف حتى تُرجع الوظيفة التي تم تمريرها صحيحًا. إرجاع العناصر المتبقية في الصفيف.
حلقة من خلال الصفيف ، باستخدام المصفوفات. إرجاع العناصر المتبقية.
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 ];
}إرجاع كل عنصر ناد في صفيف.
استخدم intstream.range (). filter () لإنشاء صفيف جديد يحتوي على كل عنصر nth من مجموعة معينة.
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 );
}ترشيح القيم غير الundique في صفيف.
استخدم المصفوفات.
public static int [] filterNonUnique ( int [] elements ) {
return Arrays . stream ( elements )
. filter ( el -> indexOf ( elements , el ) == lastIndexOf ( elements , el ))
. 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 ().
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 ();
}إرجاع قائمة العناصر الموجودة في كلا المصفمين.
قم بإنشاء مجموعة من الثانية ، ثم استخدم المصفوفات.
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 );
}إرجاع العنصر التاسع من صفيف.
استخدم Arrays.copyOfRange() للحصول على صفيف يحتوي على العنصر التاسع في المقام الأول.
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 .
خلط الصفيف باستخدام خوارزمية فيشر ييتس. استخدم 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 );
}قم بعشوائية ترتيب قيم صفيف ، وإعادة صفيف جديد.
يستخدم خوارزمية فيشر ييتس لإعادة ترتيب عناصر الصفيف.
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 التي تم إزالتها من النهاية.
استخدم n Arrays.copyOfRange()
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.asList(elements).contains() Arrays.strean().filter()
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) لمجموعة من الأرقام.
استخدم المصفوفات. Stream (). اختزال () وصيغة 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) لمجموعة من الأرقام.
استخدم المصفوفات. stream (). قلل () وصيغة 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 ممثلة في ثنائي AS 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 ));
}تحقق مما إذا كان الرقم متساويًا.
هذه الطريقة تستخدم bitwise والمشغل. 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 .
هذا سوف يقدر التعبير إلى صواب لأن القيمة تساوي القيمة.
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 ());
} RETUNS 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 ());
}يتحقق إذا كانت السلسلة هي palindrome.
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 );
}يحول سلسلة إلى حالة الكباب.
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 );
}يحول سلسلة من الأرقام مفصولة بمساحة إلى مجموعة من ints.
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 ();
}يتحقق إذا تم إرفاق Debugger بـ 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 ()));
}بدأ هذا المشروع كشوكة Java من 30 ثانية من الرمز. بفضل المتعاونين في المشروع على هذا الجهد.