مرحبا بالجميع! منذ إصدار Java 11 ، مر يوم ، والآن بدأت المراجعات الأولى للإصدار في الظهور بالفعل. سأكرس مقالتي الصغيرة إلى ما هو غير مرئي للإصدارات الرسمية ، وبالتالي حرمت من تحديث انتباه فئة String ، خاصة أنه لم يتم ذكره في
الوثائق الرسمية لـ Java 11th (على أي حال ، لم أجد معلومات عنه).

في الواقع ، إذا نظرنا إلى فئة السلسلة ، فعندئذ من بين العديد من الطرق المألوفة لدينا ، سنجد العديد منها مميزًا باسم
"@ منذ 11" . ونعم ، ظهروا رسميًا في جافا بالأمس فقط.
بالطبع ، قد تكون هناك شكوك كبيرة حول فائدة كل وظيفة ، حيث تم بالفعل كتابة أكثر الوظائف المفيدة والضرورية بالفعل في الإصدارات السابقة من Java ، ولكنها قد تكون في متناول اليد لشخص ما. كانت المقالة قصيرة ، ولكن ليس خطئي فقط ، ولكن أيضًا خطأ Oracle - فقد تضمنوا 4 طرق (+2) فقط في الإصدار ، والتي ، بالطبع ، ليست كافية.
دعنا نبدأ.
الشريط () ؛
تزيل هذه الطريقة جميع المسافات قبل أول مسافة بدون وبعد آخر. على سبيل المثال:
String withSpaces = " a "; String withoutSpaces = withSpaces.strip(); String OUTPUT_TEMPLATE = "<%s>" System.out.println(String.format(OUTPUT_TEMPLATE, withSpaces)); System.out.println(String.format(OUTPUT_TEMPLATE, withoutSpaces));
ستكون النتيجة المعروضة على الشاشة:
original: < a > strip: <a>
يحتوي الأسلوب strip () على اثنين من أقاربه - stripLeading () و stripTrailing (). الأول - يزيل المسافات فقط في المقدمة ، قبل الأول بدون مسافة. والثاني وراء فقط.
String leading = withSpaces.stripLeading(); String trailing = withSpaces.stripTrailing();
نحصل على النتيجة:
stripLeading: <a > stripTrailing: < a>
UPD
هنا في التعليقات يقترحون أنه لن يضر أن نرى ما هو الفرق بنفس طريقة القطع () ، والتي ، في جوهرها ، تفعل الشيء نفسه.
نحن ننظر. هناك اختلافات حقا.
public static String trim(byte[] value) { int len = value.length; int st = 0; while ((st < len) && ((value[st] & 0xff) <= ' ')) { st++; } while ((st < len) && ((value[len - 1] & 0xff) <= ' ')) { len--; } return ((st > 0) || (len < value.length)) ? newString(value, st, len - st) : null; }
كما نرى ، في التطبيق القديم ، باستخدام تكررين ، يتم حساب فهرس أول مسافة غير أولاً ، ثم فهرس آخر مساحة غير ، ثم يتم قطع سطر جديد وإرجاعه من هذه البيانات. فقط يتم قطع الفجوات ، لاحظ هذا.
الآن انظر إلى طريقة الشريط ().
public static String strip(byte[] value) { int left = indexOfNonWhitespace(value); if (left == value.length) { return ""; } int right = lastIndexOfNonWhitespace(value); return ((left > 0) || (right < value.length)) ? newString(value, left, right - left) : null; } public static int indexOfNonWhitespace(byte[] value) { int length = value.length; int left = 0; while (left < length) { char ch = (char)(value[left] & 0xff); if (ch != ' ' && ch != '\t' && !Character.isWhitespace(ch)) { break; } left++; } return left; } public static int lastIndexOfNonWhitespace(byte[] value) { int length = value.length; int right = length; while (0 < right) { char ch = (char)(value[right - 1] & 0xff); if (ch != ' ' && ch != '\t' && !Character.isWhitespace(ch)) { break; } right--; } return right; }
تحدد الطريقة الجديدة بشكل عام جميع الحالات التي يكون فيها الرمز غير مرئي ، سواء كان مسافة أو علامة تبويب ، إلخ. (أولئك الذين يرغبون في الدخول في غابة تنفيذ isWhiteSpace).
وبالتالي ، فإن الطريقة الجديدة هي الأفضل إذا كنت لا تريد قطع المسافات فقط ، ولكن بشكل عام جميع الأحرف غير المرئية.
isBlank () ؛
تُرجع الطريقة نتيجة الاستعلام عما إذا كانت هذه السلسلة "فارغة" ، ولا تحتوي على أحرف باستثناء المسافات وعلامات التبويب والأحرف غير المرئية الأخرى.
أي إذا قمنا بتنفيذ هذا الرمز:
String blank = " "; Boolean isBlank = blank.isBlank();
ستكون النتيجة:
true
داخل الطريقة نفسها ، هناك تطبيقان - للحروف اللاتينية ولسلسلة مشفرة UTF-16.
public boolean isBlank() { return indexOfNonWhitespace() == length(); } private int indexOfNonWhitespace() { if (isLatin1()) { return StringLatin1.indexOfNonWhitespace(value); } else { return StringUTF16.indexOfNonWhitespace(value); } }
كرر () ؛
تقوم هذه الطريقة بنسخ محتويات السلسلة لعدد محدد من المرات وإرجاع النتيجة في صف واحد.
على سبيل المثال ، عن طريق تشغيل الكود:
String sample = "(^_^) "; String multiple = sample.repeat(10);
سوف نحصل على:
(^_^) (^_^) (^_^) (^_^) (^_^) (^_^) (^_^) (^_^) (^_^) (^_^)
إذا كان عدد التكرارات صفرًا ، فلن تحتوي السلسلة على أحرف على الإطلاق.
String blank = sample.repeat(0);
النتيجة:
length: 0
خطوط () ؛
سيكون من الغريب توقع أن تقوم Oracle بإصدار تحديث String دون تضمين أي تطبيق Stream API في الفصل. وتضمنت الوظيفة في فئة السلسلة.
تحول طريقة الخطوط جميع خطوط الخط إلى الدفق المقابل. يبدو هذا:
String lines = "Blind Text Generator is a useful tool\n" + "which provides Lorem Ipsum and a number of alternatives.\n" + "The number of characters, words, and paragraphs\n" + "are easily controlled and you can set \n" + "the font to appreciate how it'll look in your design."; lines .lines() .map(l -> "next line: " + l) .forEach(System.out::println);
نحصل على النتيجة:
next line: Blind Text Generator is a useful tool next line: which provides Lorem Ipsum and a number of alternatives. next line: The number of characters, words, and paragraphs next line: are easily controlled and you can set next line: the font to appreciate how it'll look in your design.
حصلنا على تدفق كامل ، يمكننا بعد ذلك القيام بكل شيء نقوم به عادةً مع التدفقات العادية. يمكن أن يكون التطبيق لهذا مختلفًا للغاية ، وآمل أن يتم استقبال هذه الميزة بحرارة من قبل المطورين.
إذا نظرت داخل الطريقة نفسها ، فسنرى أنه لتحويل سلسلة إلى Stream ، يتم استخدام مقسومين للاختيار من بينها ، اعتمادًا على ترميز السلسلة.
public Stream<String> lines() { return isLatin1() ? StringLatin1.lines(value) : StringUTF16.lines(value); }
وبهذا تنتهي قائمة ابتكارات الإصدار في جزء السلسلة. إذا فاتني شيء ما ، فسأكون سعيدًا بمعرفته وإضافته إلى المراجعة. يمكنك أن تشعر بأن جميع الأمثلة البرمجية المقدمة بنفسك في
المورد على جيثب.