Java 11: baru dalam String

Halo semuanya! Sejak rilis Java 11, satu hari telah berlalu, dan sekarang ulasan pertama dari rilis sudah mulai muncul. Saya akan mencurahkan artikel kecil saya untuk yang tidak terlihat untuk rilis resmi dan karena itu kehilangan pembaruan perhatian dari kelas String, terutama karena tidak disebutkan dalam dokumentasi resmi Jawa ke-11 (dalam hal apa pun, saya tidak menemukan informasi tentang itu).

Memang, jika kita melihat ke kelas String, maka di antara banyak metode yang akrab bagi kita, kita akan menemukan beberapa yang ditandai sebagai "@ sejak 11" . Dan ya, secara resmi mereka muncul di Jawa hanya kemarin.

Tentu saja, mungkin ada keraguan besar tentang kegunaan masing-masing fungsi, karena fungsi yang paling berguna dan perlu sudah ditulis dalam versi Java sebelumnya, tetapi mereka mungkin berguna bagi seseorang. Artikel ini keluar pendek, tetapi ini bukan hanya kesalahan saya, tetapi juga kesalahan Oracle - mereka hanya menyertakan 4 (+2) metode dalam rilis, yang, tentu saja, tidak cukup.

Mari kita mulai.

strip ();


Metode ini menghapus semua spasi sebelum non-spasi pertama dan setelah yang terakhir. Sebagai contoh:

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)); 

Hasil yang ditampilkan di layar adalah:

 original: < a > strip: <a> 

Metode strip () memiliki dua sepupu - stripLeading () dan stripTrailing (). Yang pertama - menghapus spasi hanya di depan, sebelum yang bukan spasi pertama. Yang kedua hanya di belakang.

 String leading = withSpaces.stripLeading(); String trailing = withSpaces.stripTrailing(); 

Kami mendapatkan hasilnya:

 stripLeading: <a > stripTrailing: < a> 

UPD


Di sini, di komentar mereka menyarankan bahwa tidak ada salahnya untuk melihat apa bedanya dengan metode trim () yang sama, yang pada dasarnya melakukan hal yang sama.

Kami melihat. Memang ada perbedaan.

 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; } 

Seperti yang kita lihat, dalam implementasi lama, menggunakan dua iterasi, indeks non-ruang pertama dihitung pertama, dan kemudian indeks non-ruang terakhir, dan kemudian baris baru dipotong dan dikembalikan dari data ini. Hanya celah yang terputus, perhatikan ini.

Sekarang lihat metode strip ().

  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; } 

Metode baru menentukan secara umum semua kasus ketika simbol tidak terlihat, apakah itu spasi, tab, dll. (Mereka yang berharap bisa masuk ke hutan implementasi isWhiteSpace).

Dengan demikian, metode baru lebih disukai jika Anda ingin memangkas tidak hanya spasi, tetapi secara umum semua karakter tidak terlihat.

isBlank ();


Metode mengembalikan hasil kueri apakah string ini "kosong", tidak mengandung karakter kecuali spasi, tab, dan karakter tak terlihat lainnya.

Yaitu, jika kita menjalankan kode ini:

 String blank = " "; Boolean isBlank = blank.isBlank(); 

Hasilnya adalah:

 true 

Di dalam metode itu sendiri, ada dua implementasi - untuk karakter Latin dan untuk string yang dikodekan UTF-16.

  public boolean isBlank() { return indexOfNonWhitespace() == length(); } private int indexOfNonWhitespace() { if (isLatin1()) { return StringLatin1.indexOfNonWhitespace(value); } else { return StringUTF16.indexOfNonWhitespace(value); } } 

ulangi ();


Metode ini menyalin isi string beberapa kali dan mengembalikan hasilnya dalam satu baris.

Misalnya, dengan menjalankan kode:

 String sample = "(^_^) "; String multiple = sample.repeat(10); 

Kami akan mendapatkan:

 (^_^) (^_^) (^_^) (^_^) (^_^) (^_^) (^_^) (^_^) (^_^) (^_^) 

Jika jumlah iterasi adalah nol, maka string tidak akan mengandung karakter sama sekali.

 String blank = sample.repeat(0); 

Hasil:

 length: 0 

baris ();


Akan aneh untuk mengharapkan Oracle merilis pembaruan String tanpa menyertakan implementasi Stream API di kelas. Dan mereka memang menyertakan fungsionalitas di kelas String.

Metode garis mengubah semua garis garis ke Stream yang sesuai. Ini terlihat seperti ini:

 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); 

Kami mendapatkan hasilnya:

 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. 

Kami mendapat aliran penuh, yang dengannya kami dapat melakukan semua yang biasanya kami lakukan dengan aliran biasa. Aplikasi untuk ini bisa sangat berbeda, dan saya berharap fitur seperti itu akan diterima dengan hangat oleh para pengembang.

Jika Anda melihat ke dalam metode itu sendiri, kita akan melihat bahwa untuk mengkonversi string ke Stream, dua splitter digunakan untuk memilih, tergantung pada pengkodean string.

 public Stream<String> lines() { return isLatin1() ? StringLatin1.lines(value) : StringUTF16.lines(value); } 

Ini menyimpulkan daftar inovasi rilis di bagian String. Jika saya melewatkan sesuatu, saya akan senang mengetahuinya dan menambahkannya ke ulasan. Anda dapat merasakan sendiri semua contoh kode yang disajikan di sumber di github.

Source: https://habr.com/ru/post/id424539/


All Articles