عملیات رایج روی رشته در جاوا — راهنمای کاربردی

۳۸۴ بازدید
آخرین به‌روزرسانی: ۰۶ شهریور ۱۴۰۲
زمان مطالعه: ۳ دقیقه
عملیات رایج روی رشته در جاوا — راهنمای کاربردی

مقادیر مبتنی بر رشته و عملیات مرتبط به آن‌ها به صورت روزمره در فرایند کدنویسی مکرر مورد استفاده قرار می‌گیرند و هر توسعه‌دهنده جاوا باید بتواند با آن‌ها کار کند. در این مقاله یک راهنمای سریع و کاربردی از عملیات رایج روی رشته در جاوا ارائه می‌کنیم. به علاوه به بررسی تفاوت‌های equals و “==” و همچنین فرق‌های بین StringUtils#isBlank و isEmpty# نیز می‌پردازیم.

تبدیل یک char به رشته

Char نشان‌دهنده یک کاراکتر در جاوا است، اما در اغلب موارد ما به رشته نیاز داریم.

بنابراین این مقاله را با معرفی روش تبدیل char به رشته آغاز می‌کنیم:

1String toStringWithConcatenation(final char c) {
2    return String.valueOf(c);
3}

الحاق رشته‌ها

عملیات رایج دیگر که اغلب مورد نیاز است، الحاق رشته‌ها با مقادیر دیگر مانند char است:

1String appendWithConcatenation(final String prefix, final char c) {
2    return prefix + c;
3}

ما می‌توانیم انواع مقدماتی را با StringBuilder نیز الحاق کنیم:

1String appendWithStringBuilder(final String prefix, final char c) {
2    return new StringBuilder(prefix).append(c).toString();
3}

دریافت کاراکتر بر اساس اندیس

اگر لازم باشد که دقیقاً یک کاراکتر را از یک رشته استخراج کنیم، می‌توانیم از API به این منظور استفاده کنیم:

1char getCharacterByIndex(final String text, final int index) {
2    return text.charAt(index);
3}

از آنجا که یک String از یک []char به عنوان ساختمان داده زیربنایی خود استفاده می‌کند، اندیس آن از صفر آغاز می‌شود.

مدیریت مقادیر ASCII

می‌توانیم به سادگی بین یک char و بازنمایی عددی آن (ASCII) از طریق تبدیل نوع سوئیچ کنیم:

1int asciiValue(final char character) {
2    return (int) character;
3}
4 
5char fromAsciiValue(final int value) {
6    Assert.isTrue(value >= 0 && value < 65536, "value is not a valid character");
7    return (char) value;
8}

البته از آنجا که یک int در واقع 4 بایت بی علامت و یک char 2 بایت بی علامت است، باید بررسی کنیم تا مطمئن شویم که با مقادیر کاراکتر معتبری کار می‌کنیم.

حذف همه فاصله‌های خالی

گاهی اوقات باید از شر برخی کاراکترها رها شویم که در اغلب موارد شامل فاصله‌های خالی می‌شود. یک روش مناسب استفاده از متد replaceAll به همراه یک «عبارت منظم» (regular expression) است:

1String removeWhiteSpace(final String text) {
2    return text.replaceAll("\\s+", "");
3}

الحاق کلکسیون‌ها به یک رشته

کاربرد رایج دیگر هنگامی است که یک کلکسیون داریم و می‌خواهیم یک رشته از روی آن بسازیم:

1<T> String fromCollection(final Collection<T> collection) { 
2   return collection.stream().map(Objects::toString).collect(Collectors.joining(", "));
3}

توجه کنید که Collectors.joining امکان تعیین پیشوند و یا پسوند را فراهم می‌سازد.

افراز یک رشته

از سوی دیگر گاهی می‌خواهیم یک رشته را با استفاده از متد split و از طریق یک کاراکتر جداساز به زیرمجموعه‌هایی افراز کنیم:

1String[] splitByRegExPipe(final String text) {
2   return text.split("\\|");
3}

در این مورد نیز از یک عبارت منظم استفاده می‌کنیم و این بار به وسیله یک pipe افراز می‌کنیم. از آنجا که می‌خواهیم از یک کاراکتر خاص استفاده کنیم باید آن را escape کنیم. امکان دیگر آن است که از کلاس Pattern استفاده کنیم:

1String[] splitByPatternPipe(final String text) {
2    return text.split(Pattern.quote("|"));
3}

پردازش همه کاراکترها به صورت یک استریم

در مورد پردازش تفصیلی می‌توانیم یک رشته را به یک IntStream تبدیل کنیم:

1IntStream getStream(final String text) {
2    return text.chars();
3}

برابری ارجاعی و برابری مقداری

با این که رشته‌ها شبیه یک «نوع اولیه» (primitive type) به نظر می‌رسند، اما چنین نیستند. بنابراین باید بین برابری ارجاعی و برابری مقداری تمایز قائل شویم. برابری ارجاعی همواره به معنی برابری مقداری نیز خواهد بود، اما عکس این حالت به طور کلی صادق نیست. بنابراین در ابتدا با عملیات == مقایسه می‌کنیم و سپس از متد equals استفاده می‌کنیم:

1@Test
2public void whenUsingEquals_thenWeCheckForTheSameValue() {
3    assertTrue("Values are equal", new String("Test").equals("Test"));
4}
5 
6@Test
7public void whenUsingEqualsSign_thenWeCheckForReferenceEquality() {
8    assertFalse("References are not equal", new String("Test") == "Test");
9}

توجه داشته باشید که literal-ها در string pool جاوا وارد شده‌اند. از این رو کامپایلر می‌تواند گاهی اوقات آن‌ها را به همان مرجع بهینه سازی کند:

1@Test
2public void whenTheCompileCanBuildUpAString_thenWeGetTheSameReference() {
3    assertTrue("Literals are concatenated by the compiler", "Test" == "Te"+"st");
4}

مقایسه رشته‌های خالی با رشته‌های تهی

تفاوت ظریفی بین دو متد isBlank و isEmpty وجود دارد. یک رشته زمانی تهی است که null بوده یا طول صفر داشته باشد، در حالی که رشته زمانی خالی است که null یا صرفاً شامل کاراکترهای فاصله باشد:

1@Test
2public void whenUsingIsEmpty_thenWeCheckForNullorLengthZero() {
3    assertTrue("null is empty", isEmpty(null));
4    assertTrue("nothing is empty", isEmpty(""));
5    assertFalse("whitespace is not empty", isEmpty(" "));
6    assertFalse("whitespace is not empty", isEmpty("\n"));
7    assertFalse("whitespace is not empty", isEmpty("\t"));
8    assertFalse("text is not empty", isEmpty("Anything!"));
9}
10 
11@Test
12public void whenUsingIsBlank_thenWeCheckForNullorOnlyContainingWhitespace() {
13    assertTrue("null is blank", isBlank(null));
14    assertTrue("nothing is blank", isBlank(""));
15    assertTrue("whitespace is blank", isBlank("\t\t \t\n\r"));
16    assertFalse("test is not blank", isBlank("Anything!"));
17}

سخن پایانی

رشته‌ها یک نوع اساسی در همه انواع اپلیکیشن‌ها محسوب می‌شوند. در این راهنما با برخی عملیات کلیدی در حالت‌های مختلف آشنا شدیم. به علاوه برخی اطلاعات در مورد مرجع‌های تفصیلی‌تر به دست آوردیم. در نهایت باید اشاره کنیم که کد کامل موارد مطرح شده در این مقاله را می‌توانید در این ریپوی گیت‌هاب (+) ملاحظه کنید.

اگر این مطلب برای شما مفید بوده است، آموزش‌های زیر نیز به شما پیشنهاد می‌شوند:

==

بر اساس رای ۰ نفر
آیا این مطلب برای شما مفید بود؟
اگر بازخوردی درباره این مطلب دارید یا پرسشی دارید که بدون پاسخ مانده است، آن را از طریق بخش نظرات مطرح کنید.
منابع:
baeldung
نظر شما چیست؟

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *