สวัสดีทุกคนผู้อ่านที่รักของฉัน ฉันพยายามเขียนเกี่ยวกับสิ่งที่ฉันสนใจจริงๆ และสิ่งที่ฉันกังวลในขณะนี้ ดังนั้นวันนี้จะมีการอ่านแบบเบา ๆ ที่จะเป็นประโยชน์สำหรับคุณเป็นข้อมูลอ้างอิงในอนาคต: มาพูดถึงStringUtilsกัน ดีกว่า
มันเกิดขึ้นเมื่อครั้งหนึ่งฉันข้าม ไลบรารี Apache Commons Lang 3 นี่คือไลบรารีที่มีคลาสเสริมสำหรับการทำงานกับอ็อบเจ็กต์ต่างๆ นี่คือคอลเลกชันของวิธีการที่เป็นประโยชน์สำหรับการทำงานกับสตริง คอลเลกชัน และอื่นๆ ในโครงการปัจจุบัน ซึ่งฉันต้องทำงานโดยละเอียดมากขึ้นด้วยสตริงในการแปลตรรกะทางธุรกิจอายุ 25 ปี (จาก COBOL เป็น Java) ปราก ฎว่าฉันไม่มีความรู้อย่างลึกซึ้งเกี่ยวกับคลาสStringUtils ฉันจึงต้องสร้างทุกอย่างขึ้นมาเอง สิ่งที่ผมหมายถึง? ความจริงที่ว่าคุณไม่จำเป็นต้องเขียนงานบางอย่างที่เกี่ยวข้องกับการจัดการสตริงด้วยตัวเอง แต่ใช้โซลูชันสำเร็จรูป ตัวเองเขียนผิดอะไร? อย่างน้อยนี่ก็เป็นโค้ดเพิ่มเติมที่ถูกเขียนไว้เมื่อนานมาแล้ว ความกดดันไม่น้อยคือปัญหาของการทดสอบโค้ดที่เขียนเพิ่มเติม เมื่อเราใช้ไลบรารี่ที่พิสูจน์ตัวเองแล้วว่าดี เราคาดหวังว่าไลบรารีนั้นได้รับการทดสอบแล้ว และเราไม่จำเป็นต้องเขียนกรณีทดสอบจำนวนมากเพื่อทดสอบ มันบังเอิญว่าชุดวิธีการทำงานกับสตริงใน Java มีขนาดไม่ใหญ่นัก มีวิธีการไม่มากนักที่จะเป็นประโยชน์ต่อการทำงาน คลาสนี้ยังถูกสร้างขึ้นเพื่อให้ตรวจสอบ NullPointerException โครงร่างของบทความของเราจะเป็นดังนี้:
ตัวอย่างแรกโดยทั่วไปดูงี่เง่ามากในตอนนี้ซึ่งเป็นเรื่องที่ดีมากที่เพื่อนร่วมงานของฉันรู้เกี่ยวกับStringUtils.leftPadและบอกฉัน ภารกิจคืออะไร: โค้ดถูกสร้างขึ้นในลักษณะที่จำเป็นในการแปลงข้อมูลหากมาไม่ถูกต้อง คาดว่าฟิลด์สตริงควรประกอบด้วยตัวเลขเท่านั้น เช่น ถ้าความยาวของมันคือ 3 และค่าของมันคือ 1 ดังนั้นรายการควรเป็น “001” นั่นคือก่อนอื่นคุณต้องลบช่องว่างทั้งหมดออกแล้วปิดด้วยศูนย์ ตัวอย่างเพิ่มเติมเพื่อทำให้สาระสำคัญของงานชัดเจน: จาก “12“ -> “012” จาก “1“ -> “001” และอื่นๆ ฉันทำอะไร? อธิบายสิ่งนี้ในคลาสLeftPadExample ฉันเขียนวิธีการที่จะทำทั้งหมดนี้:
ที่นี่ฉันต้องแก้ไขปัญหาด้วยบรรทัดที่อาจมีช่องว่างและลูกน้ำที่จุดเริ่มต้น หลังจากการเปลี่ยนแปลงพวกเขาไม่ควรมีความหมายใหม่ คำชี้แจงปัญหามีความชัดเจนมากขึ้นกว่าเดิม ตัวอย่างบางส่วนจะเสริมความเข้าใจของเรา: “, , books” -> “books” “,,, books” -> “books” b , books” -> “b , books” เช่นเดียวกับในกรณีของ leftPad ฉันได้เพิ่ม คลาส StrimStartExampleซึ่งมีสองวิธี หนึ่ง - ด้วยโซลูชันของตัวเอง:
แน่นอนว่าวิธีนี้ง่ายกว่ามาก แต่ก็ไม่ได้ทำให้มีประโยชน์น้อยลงเลย ขยายขีดความสามารถของ เมธอด String.isEmpty()ซึ่งเพิ่มการตรวจสอบค่าว่างด้วย เพื่ออะไร? เมื่อต้องการหลีกเลี่ยง NullPointerException นั่นคือเพื่อหลีกเลี่ยงการเรียกวิธีการบนตัวแปรที่เป็นnull ดังนั้นเพื่อไม่ให้เขียน:
วิธีการดังกล่าวมีอยู่ในStringและจะส่ง NullPointerException หากเมื่อเปรียบเทียบสองสตริง หนึ่งในนั้นเป็นโมฆะ เพื่อหลีกเลี่ยงการตรวจสอบที่น่าเกลียดในโค้ดของเรา เราสามารถใช้ เมธอด StringUtils.compare(String str1, String str2) : มันจะคืนค่า int เป็นผลลัพธ์ของการเปรียบเทียบ ค่าเหล่านี้หมายถึงอะไร? int = 0 ถ้าเหมือนกัน (หรือทั้งสองอย่างเป็นโมฆะ) int < 0 ถ้า str1 น้อยกว่า str2 int > 0 ถ้า str1 มากกว่า str2 นอกจากนี้ หากคุณดูเอกสารประกอบ Javadoc ของวิธีนี้จะแสดงสถานการณ์ต่อไปนี้:
ที่นี่นักพัฒนายูทิลิตี้มีระเบิด อยากได้วิธีไหนก็อยู่ที่นั่น ฉันตัดสินใจรวบรวมมันเข้าด้วยกัน:
ชุดวิธีการที่ช่วยหลีกเลี่ยงการเพิ่มข้อมูลเพิ่มเติมหากสตริงเป็นโมฆะ และคุณจำเป็นต้องตั้งค่าเริ่มต้นบางส่วน มีตัวเลือกมากมายให้เหมาะกับทุกรสนิยม หัวหน้าในหมู่พวกเขาคือStringUtils.defaultString(final String str, Final String defaultStr) - ใน กรณีที่ str เป็นโมฆะ เราก็จะส่ง ค่าไปที่ defaultStr ตัวอย่างจากเอกสารประกอบ:
นี่เป็นวิธีการที่น่าสนใจแม้ว่าจะมีตัวเลือกไม่มากนักสำหรับการสมัครก็ตาม ในขณะเดียวกันหากเกิดกรณีเช่นนี้วิธีการนี้จะมีประโยชน์มากอย่างแน่นอน มันจะลบช่องว่างทั้งหมดออกจากสตริง ไม่ว่าช่องว่างนี้จะอยู่ที่ไหนก็จะไม่มีร่องรอยของมัน))) ตัวอย่างจากเอกสาร:
พูดเพื่อตัวเอง นี่เป็นวิธีที่มีประโยชน์มาก โดยจะตรวจสอบว่าสตริงลงท้ายด้วยสตริงที่แนะนำหรือไม่ สิ่งนี้มักจำเป็น แน่นอนคุณสามารถเขียนเช็คได้ด้วยตัวเอง แต่การใช้วิธีสำเร็จรูปนั้นสะดวกและดีกว่าอย่างชัดเจน ตัวอย่าง:
ตัวอย่างที่ดีของวิธีการที่ปลอดภัยแบบ null ที่เปรียบเทียบสองสตริง อะไรก็ตามที่เราใส่ลงไป คำตอบก็จะอยู่ที่นั่น และมันจะไม่มีข้อผิดพลาด ตัวอย่าง:
ไปข้างหน้าและขยายวิธี การ เท่ากับ สมมติว่าแทนที่จะตรวจสอบความเท่าเทียมกันหลายครั้ง เราต้องการดำเนินการอย่างหนึ่ง สำหรับสิ่งนี้ เราสามารถส่งผ่านสตริงที่จะเปรียบเทียบชุดสตริงได้ หากรายการใดรายการหนึ่งเท่ากับสตริงที่เสนอ ก็จะเป็น TRUE เราส่งสตริงและคอลเลกชันของสตริงเพื่อเปรียบเทียบกัน (สตริงแรกที่มีสตริงจากคอลเลกชัน) ยาก? ต่อไปนี้เป็นตัวอย่างจากเอกสารเพื่อช่วยให้คุณเข้าใจความหมาย:
- วิธีการเชื่อมต่อ?
- ตัวอย่างจากงานของฉัน: ฉันสร้าง ไม้ค้ำ
จักรยานโดยไม่รู้ว่ามีประโยชน์เช่นนี้ได้อย่างไร - ลองดูวิธีอื่นที่ฉันพบว่าน่าสนใจ
- มาสรุปกัน
0. วิธีการเชื่อมต่อ
คนที่เดินจูงมือกับฉันนั้นคุ้นเคยกับทั้ง Git และ Maven ไม่มากก็น้อยอยู่แล้ว ดังนั้นฉันจะอาศัยความรู้นี้ต่อไปและไม่พูดซ้ำอีก สำหรับผู้ที่พลาดบทความก่อนหน้าของฉันหรือเพิ่งเริ่มอ่าน นี่คือเนื้อหาเกี่ยวกับMavenและGit แน่นอนว่าหากไม่มีระบบบิลด์ (Maven, Gredl) คุณสามารถเชื่อมต่อทุกอย่างด้วยตนเองได้ แต่ทุกวันนี้มันบ้าไปแล้วและคุณไม่จำเป็นต้องทำอย่างนั้น: เป็นการดีกว่าถ้าคุณเรียนรู้วิธีทำทุกอย่างอย่างถูกต้องทันที ดังนั้น ในการทำงานร่วมกับ Maven เราจึงเพิ่มการขึ้นต่อกันที่เหมาะสมก่อน:<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>${apache.common.version}</version>
</dependency>
โดยที่${apache.common.version}เป็นเวอร์ชันของไลบรารีนี้ ถัดไป หากต้องการนำเข้าในบางคลาส ให้เพิ่มการนำเข้า:
import org.apache.commons.lang3.StringUtils;
และนั่นคือทั้งหมดที่อยู่ในกระเป๋า))
1. ตัวอย่างจากโครงการจริง
- วิธี leftPad
ตัวอย่างแรกโดยทั่วไปดูงี่เง่ามากในตอนนี้ซึ่งเป็นเรื่องที่ดีมากที่เพื่อนร่วมงานของฉันรู้เกี่ยวกับStringUtils.leftPadและบอกฉัน ภารกิจคืออะไร: โค้ดถูกสร้างขึ้นในลักษณะที่จำเป็นในการแปลงข้อมูลหากมาไม่ถูกต้อง คาดว่าฟิลด์สตริงควรประกอบด้วยตัวเลขเท่านั้น เช่น ถ้าความยาวของมันคือ 3 และค่าของมันคือ 1 ดังนั้นรายการควรเป็น “001” นั่นคือก่อนอื่นคุณต้องลบช่องว่างทั้งหมดออกแล้วปิดด้วยศูนย์ ตัวอย่างเพิ่มเติมเพื่อทำให้สาระสำคัญของงานชัดเจน: จาก “12“ -> “012” จาก “1“ -> “001” และอื่นๆ ฉันทำอะไร? อธิบายสิ่งนี้ในคลาสLeftPadExample ฉันเขียนวิธีการที่จะทำทั้งหมดนี้:
public static String ownLeftPad(String value) {
String trimmedValue = value.trim();
if(trimmedValue.length() == value.length()) {
return value;
}
StringBuilder newValue = new StringBuilder(trimmedValue);
IntStream.rangeClosed(1, value.length() - trimmedValue.length())
.forEach(it -> newValue.insert(0, "0"));
return newValue.toString();
}
โดยพื้นฐานแล้ว ฉันเอาแนวคิดที่ว่าเราสามารถหาความแตกต่างระหว่างค่าดั้งเดิมกับค่าที่ตัดแต่งแล้วเติมด้วยศูนย์ข้างหน้า เมื่อต้องการทำสิ่งนี้ ฉันใช้IntStreamเพื่อทำการดำเนินการเดียวกัน n ครั้ง และสิ่งนี้จะต้องได้รับการทดสอบอย่างแน่นอน นี่คือสิ่งที่ฉันสามารถทำได้หากรู้ล่วงหน้าเกี่ยวกับ วิธี StringUtils.leftPad :
public static String apacheCommonLeftPad(String value) {
return StringUtils.leftPad(value.trim(), value.length(), "0");
}
อย่างที่คุณเห็นมีโค้ดน้อยกว่ามากและมีการใช้ไลบรารี่ที่ทุกคนยืนยันด้วย เพื่อจุดประสงค์นี้ ฉันได้สร้างการทดสอบสองครั้งใน คลาส LeftPadExampleTest (โดยปกติเมื่อพวกเขาวางแผนที่จะทดสอบคลาส พวกเขาจะสร้างคลาสที่มีชื่อเดียวกัน + การทดสอบในแพ็คเกจเดียวกัน เฉพาะใน src/test/java) การทดสอบเหล่านี้จะตรวจสอบวิธีการหนึ่งเพื่อให้แน่ใจว่าแปลงค่าได้อย่างถูกต้อง จากนั้นจึงตรวจสอบอีกวิธีหนึ่ง แน่นอนว่า จะต้องมีการเขียนการทดสอบอีกมาก แต่การทดสอบไม่ใช่หัวข้อหลักในกรณีของเรา:
package com.github.javarushcommunity.stringutilsdemo;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.*;
@DisplayName("Unit-level testing for LeftPadExample")
class LeftPadExampleTest {
@DisplayName("Should transform by using ownLeftPad method as expected")
@Test
public void shouldTransformOwnLeftPadAsExpected() {
//given
String value = "1 ";
String expectedTransformedValue = "0001";
//when
String transformedValue = LeftPadExample.ownLeftPad(value);
//then
Assertions.assertEquals(expectedTransformedValue, transformedValue);
}
@DisplayName("Should transform by using StringUtils method as expected")
@Test
public void shouldTransformStringUtilsLeftPadAsExpected() {
//given
String value = "1 ";
String expectedTransformedValue = "0001";
//when
String transformedValue = LeftPadExample.apacheCommonLeftPad(value);
//then
Assertions.assertEquals(expectedTransformedValue, transformedValue);
}
}
ฉันสามารถแสดงความคิดเห็นเกี่ยวกับการทดสอบได้ในตอนนี้ เขียนโดยใช้ JUnit 5:
- การทดสอบจะถือเป็นการทดสอบหากมีคำอธิบายประกอบที่เหมาะสม - @Test
- หากเป็นการยากที่จะอธิบายการดำเนินการของการทดสอบในชื่อหรือคำอธิบายยาวและไม่สะดวกในการอ่าน คุณสามารถเพิ่มคำอธิบายประกอบ @DisplayName และทำให้เป็นคำอธิบายปกติที่จะมองเห็นได้เมื่อรันการทดสอบ
- เมื่อเขียนการทดสอบ ฉันใช้วิธีการ BDD โดยแบ่งการทดสอบออกเป็นส่วนตรรกะ:
- // กำหนด - บล็อกการตั้งค่าข้อมูลก่อนการทดสอบ
- // เมื่อใดคือบล็อกที่ส่วนของโค้ดที่เรากำลังทดสอบถูกเปิดใช้งาน
- //then คือบล็อกที่มีการตรวจสอบผลลัพธ์ของบล็อกเมื่อ
- วิธีการ stripStart
ที่นี่ฉันต้องแก้ไขปัญหาด้วยบรรทัดที่อาจมีช่องว่างและลูกน้ำที่จุดเริ่มต้น หลังจากการเปลี่ยนแปลงพวกเขาไม่ควรมีความหมายใหม่ คำชี้แจงปัญหามีความชัดเจนมากขึ้นกว่าเดิม ตัวอย่างบางส่วนจะเสริมความเข้าใจของเรา: “, , books” -> “books” “,,, books” -> “books” b , books” -> “b , books” เช่นเดียวกับในกรณีของ leftPad ฉันได้เพิ่ม คลาส StrimStartExampleซึ่งมีสองวิธี หนึ่ง - ด้วยโซลูชันของตัวเอง:
public static String ownStripStart(String value) {
int index = 0;
List commaSpace = asList(" ", ",");
for (int i = 0; i < value.length(); i++) {
if (commaSpace.contains(String.valueOf(value.charAt(i)))) {
index++;
} else {
break;
}
}
return value.substring(index);
}
แนวคิดนี้คือการค้นหาดัชนีโดยเริ่มจากที่ไม่มีช่องว่างหรือเครื่องหมายจุลภาคอีกต่อไป หากไม่มีพวกมันเลยตั้งแต่แรก ดัชนีจะเป็นศูนย์ และอันที่สอง - พร้อมวิธีแก้ปัญหาผ่านStringUtils :
public static String apacheCommonLeftPad(String value) {
return StringUtils.stripStart(value, StringUtils.SPACE + COMMA);
}
ที่นี่เราส่งข้อมูลอาร์กิวเมนต์แรกเกี่ยวกับสตริงที่เรากำลังใช้งาน และในวินาทีที่เราส่งผ่านสตริงที่ประกอบด้วยอักขระที่ต้องข้าม เราสร้างคลาส StripStartExampleTestด้วยวิธีเดียวกัน:
package com.github.javarushcommunity.stringutilsdemo;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
@DisplayName("Unit-level testing for StripStartExample")
class StripStartExampleTest {
@DisplayName("Should transform by using stripStart method as expected")
@Test
public void shouldTransformOwnStripStartAsExpected() {
//given
String value = ", , books";
String expectedTransformedValue = "books";
//when
String transformedValue = StripStartExample.ownStripStart(value);
//then
Assertions.assertEquals(expectedTransformedValue, transformedValue);
}
@DisplayName("Should transform by using StringUtils method as expected")
@Test
public void shouldTransformStringUtilsStripStartAsExpected() {
//given
String value = ", , books";
String expectedTransformedValue = "books";
//when
String transformedValue = StripStartExample.apacheCommonLeftPad(value);
//then
Assertions.assertEquals(expectedTransformedValue, transformedValue);
}
}
- วิธีการ isEmpty
แน่นอนว่าวิธีนี้ง่ายกว่ามาก แต่ก็ไม่ได้ทำให้มีประโยชน์น้อยลงเลย ขยายขีดความสามารถของ เมธอด String.isEmpty()ซึ่งเพิ่มการตรวจสอบค่าว่างด้วย เพื่ออะไร? เมื่อต้องการหลีกเลี่ยง NullPointerException นั่นคือเพื่อหลีกเลี่ยงการเรียกวิธีการบนตัวแปรที่เป็นnull ดังนั้นเพื่อไม่ให้เขียน:
if(value != null && value.isEmpty()) {
//doing something
}
คุณสามารถทำได้:
if(StringUtils.isEmpty(value)) {
//doing something
}
ข้อดีของวิธีนี้คือชัดเจนทันทีว่าจะใช้วิธีใด
2. การวิเคราะห์วิธีการอื่นของคลาส StringUtils
ตอนนี้เรามาพูดถึงวิธีการเหล่านั้นที่ในความคิดของฉันสมควรได้รับความสนใจเช่นกัน การพูดโดยทั่วไปเกี่ยวกับStringUtilsมันคุ้มค่าที่จะบอกว่ามันมีวิธีการที่ปลอดภัยแบบ null ซึ่งคล้ายกับที่พบใน คลาส String (เช่นเดียวกับกรณีของ วิธี isEmpty ) มาดูกันดีกว่า:
- วิธีการเปรียบเทียบ
วิธีการดังกล่าวมีอยู่ในStringและจะส่ง NullPointerException หากเมื่อเปรียบเทียบสองสตริง หนึ่งในนั้นเป็นโมฆะ เพื่อหลีกเลี่ยงการตรวจสอบที่น่าเกลียดในโค้ดของเรา เราสามารถใช้ เมธอด StringUtils.compare(String str1, String str2) : มันจะคืนค่า int เป็นผลลัพธ์ของการเปรียบเทียบ ค่าเหล่านี้หมายถึงอะไร? int = 0 ถ้าเหมือนกัน (หรือทั้งสองอย่างเป็นโมฆะ) int < 0 ถ้า str1 น้อยกว่า str2 int > 0 ถ้า str1 มากกว่า str2 นอกจากนี้ หากคุณดูเอกสารประกอบ Javadoc ของวิธีนี้จะแสดงสถานการณ์ต่อไปนี้:
StringUtils.compare(null, null) = 0
StringUtils.compare(null , "a") < 0
StringUtils.compare("a", null) > 0
StringUtils.compare("abc", "abc") = 0
StringUtils.compare("a", "b") < 0
StringUtils.compare("b", "a") > 0
StringUtils.compare("a", "B") > 0
StringUtils.compare("ab", "abc") < 0
- ประกอบด้วย... วิธีการ
ที่นี่นักพัฒนายูทิลิตี้มีระเบิด อยากได้วิธีไหนก็อยู่ที่นั่น ฉันตัดสินใจรวบรวมมันเข้าด้วยกัน:
-
บรรจุเป็นวิธีการตรวจสอบว่าสตริงที่คาดหวังอยู่ภายในสตริงอื่นหรือไม่ สิ่งนี้มีประโยชน์อย่างไร? คุณสามารถใช้วิธีนี้ได้หากต้องการให้แน่ใจว่ามีคำบางคำในข้อความ
ตัวอย่าง:
StringUtils.contains(null, *) = false StringUtils.contains(*, null) = false StringUtils.contains("", "") = true StringUtils.contains("abc", "") = true StringUtils.contains("abc", "a") = true StringUtils.contains("abc", "z") = false
อีกครั้ง มีการรักษาความปลอดภัย NPE (Null Pointer Exception)
containsAnyเป็นวิธีการตรวจสอบว่ามีอักขระใด ๆ ที่มีอยู่ในสตริงหรือไม่ สิ่งที่มีประโยชน์ด้วย: คุณต้องทำสิ่งนี้บ่อยครั้ง ตัวอย่างจากเอกสารประกอบ:
StringUtils.containsAny(null, *) = false StringUtils.containsAny("", *) = false StringUtils.containsAny(*, null) = false StringUtils.containsAny(*, []) = false StringUtils.containsAny("zzabyycdxx", ['z', 'a']) = true StringUtils.containsAny("zzabyycdxx", ['b', 'y']) = true StringUtils.containsAny("zzabyycdxx", ['z', 'y']) = true StringUtils.containsAny("aba", ['z']) = false
-
containsIgnoreCaseเป็นส่วนขยายที่มีประโยชน์สำหรับเมธอดcontains แน่นอนว่าหากต้องการตรวจสอบกรณีดังกล่าวโดยไม่ใช้วิธีนี้ คุณจะต้องดำเนินการหลายตัวเลือก ดังนั้นจะใช้วิธีเดียวเท่านั้นอย่างกลมกลืน
-
มีไม่มี - เมื่อพิจารณาจากชื่อ คุณสามารถเข้าใจสิ่งที่กำลังตรวจสอบได้แล้ว ไม่ควรมีเส้นอยู่ข้างใน สิ่งที่มีประโยชน์แน่นอน ค้นหาอักขระที่ไม่ต้องการอย่างรวดเร็ว ;) ในบอทโทรเลข ของเรา เราจะกรองคำหยาบคาย และจะไม่เพิกเฉยต่อวิธีการตลกๆ เหล่านี้
และตัวอย่าง เราจะอยู่ที่ไหนถ้าไม่มีพวกเขา:
StringUtils.containsNone(null, *) = true StringUtils.containsNone(*, null) = true StringUtils.containsNone("", *) = true StringUtils.containsNone("ab", '') = true StringUtils.containsNone("abab", 'xyz') = true StringUtils.containsNone("ab1", 'xyz') = true StringUtils.containsNone("abz", 'xyz') = false
ตัวอย่างบางส่วนจากเอกสาร:
StringUtils.containsIgnoreCase(null, *) = false
StringUtils.containsIgnoreCase(*, null) = false
StringUtils.containsIgnoreCase("", "") = true
StringUtils.containsIgnoreCase("abc", "") = true
StringUtils.containsIgnoreCase("abc", "a") = true
StringUtils.containsIgnoreCase("abc", "z") = false
StringUtils.containsIgnoreCase("abc", "A") = true
StringUtils.containsIgnoreCase("abc", "Z") = false
- วิธีการ defaultString
ชุดวิธีการที่ช่วยหลีกเลี่ยงการเพิ่มข้อมูลเพิ่มเติมหากสตริงเป็นโมฆะ และคุณจำเป็นต้องตั้งค่าเริ่มต้นบางส่วน มีตัวเลือกมากมายให้เหมาะกับทุกรสนิยม หัวหน้าในหมู่พวกเขาคือStringUtils.defaultString(final String str, Final String defaultStr) - ใน กรณีที่ str เป็นโมฆะ เราก็จะส่ง ค่าไปที่ defaultStr ตัวอย่างจากเอกสารประกอบ:
StringUtils.defaultString(null, "NULL") = "NULL"
StringUtils.defaultString("", "NULL") = ""
StringUtils.defaultString("bat", "NULL") = "bat"
สะดวกมากที่จะใช้เมื่อคุณสร้างคลาส POJO ด้วยข้อมูล
- ลบวิธี Whitespace
นี่เป็นวิธีการที่น่าสนใจแม้ว่าจะมีตัวเลือกไม่มากนักสำหรับการสมัครก็ตาม ในขณะเดียวกันหากเกิดกรณีเช่นนี้วิธีการนี้จะมีประโยชน์มากอย่างแน่นอน มันจะลบช่องว่างทั้งหมดออกจากสตริง ไม่ว่าช่องว่างนี้จะอยู่ที่ไหนก็จะไม่มีร่องรอยของมัน))) ตัวอย่างจากเอกสาร:
StringUtils.deleteWhitespace(null) = null
StringUtils.deleteWhitespace("") = ""
StringUtils.deleteWhitespace("abc") = "abc"
StringUtils.deleteWhitespace(" ab c ") = "abc"
- สิ้นสุดด้วยวิธี
พูดเพื่อตัวเอง นี่เป็นวิธีที่มีประโยชน์มาก โดยจะตรวจสอบว่าสตริงลงท้ายด้วยสตริงที่แนะนำหรือไม่ สิ่งนี้มักจำเป็น แน่นอนคุณสามารถเขียนเช็คได้ด้วยตัวเอง แต่การใช้วิธีสำเร็จรูปนั้นสะดวกและดีกว่าอย่างชัดเจน ตัวอย่าง:
StringUtils.endsWith(null, null) = true
StringUtils.endsWith(null, "def") = false
StringUtils.endsWith("abcdef", null) = false
StringUtils.endsWith("abcdef", "def") = true
StringUtils.endsWith("ABCDEF", "def") = false
StringUtils.endsWith("ABCDEF", "cde") = false
StringUtils.endsWith("ABCDEF", "") = true
อย่างที่คุณเห็น ทุกอย่างลงท้ายด้วยบรรทัดว่าง))) ฉันคิดว่าตัวอย่างนี้(StringUtils.endsWith("ABCDEF", "") = true)เป็นเพียงโบนัส เพราะนี่เป็นเรื่องไร้สาระ) นอกจากนี้ยังมีวิธีที่ ละเว้นกรณี
- เท่ากับวิธีการ
ตัวอย่างที่ดีของวิธีการที่ปลอดภัยแบบ null ที่เปรียบเทียบสองสตริง อะไรก็ตามที่เราใส่ลงไป คำตอบก็จะอยู่ที่นั่น และมันจะไม่มีข้อผิดพลาด ตัวอย่าง:
StringUtils.equals(null, null) = true
StringUtils.equals(null, "abc") = false
StringUtils.equals("abc", null) = false
StringUtils.equals("abc", "abc") = true
StringUtils.equals("abc", "ABC") = false
แน่นอนว่ายังมีเท่ากับ IgnoreCase - ทุกอย่างทำในลักษณะเดียวกันทุกประการ มีเพียงเราเท่านั้นที่เพิกเฉยต่อกรณีนี้ มาดูกัน?
StringUtils.equalsIgnoreCase(null, null) = true
StringUtils.equalsIgnoreCase(null, "abc") = false
StringUtils.equalsIgnoreCase("abc", null) = false
StringUtils.equalsIgnoreCase("abc", "abc") = true
StringUtils.equalsIgnoreCase("abc", "ABC") = true
- เท่ากับวิธีใดก็ได้
ไปข้างหน้าและขยายวิธี การ เท่ากับ สมมติว่าแทนที่จะตรวจสอบความเท่าเทียมกันหลายครั้ง เราต้องการดำเนินการอย่างหนึ่ง สำหรับสิ่งนี้ เราสามารถส่งผ่านสตริงที่จะเปรียบเทียบชุดสตริงได้ หากรายการใดรายการหนึ่งเท่ากับสตริงที่เสนอ ก็จะเป็น TRUE เราส่งสตริงและคอลเลกชันของสตริงเพื่อเปรียบเทียบกัน (สตริงแรกที่มีสตริงจากคอลเลกชัน) ยาก? ต่อไปนี้เป็นตัวอย่างจากเอกสารเพื่อช่วยให้คุณเข้าใจความหมาย:
StringUtils.equalsAny(null, (CharSequence[]) null) = false
StringUtils.equalsAny(null, null, null) = true
StringUtils.equalsAny(null, "abc", "def") = false
StringUtils.equalsAny("abc", null, "def") = false
StringUtils.equalsAny("abc", "abc", "def") = true
StringUtils.equalsAny("abc", "ABC", "DEF") = false
นอกจากนี้ยังมีเท่ากับAnyIgnoreCase และตัวอย่างสำหรับมัน:
StringUtils.equalsAnyIgnoreCase(null, (CharSequence[]) null) = false
StringUtils.equalsAnyIgnoreCase(null, null, null) = true
StringUtils.equalsAnyIgnoreCase(null, "abc", "def") = false
StringUtils.equalsAnyIgnoreCase("abc", null, "def") = false
StringUtils.equalsAnyIgnoreCase("abc", "abc", "def") = true
StringUtils.equalsAnyIgnoreCase("abc", "ABC", "DEF") = true
บรรทัดล่าง
ด้วยเหตุนี้เราจึงออกไปพร้อมกับความรู้ว่าStringUtils คืออะไร และมีวิธีใดบ้างที่มีประโยชน์ ด้วยความตระหนักดีว่ามีสิ่งที่มีประโยชน์เช่นนี้และไม่จำเป็นต้องรั้วไม้ค้ำทุกครั้งในสถานที่ซึ่งเป็นไปได้ที่จะปิดปัญหาด้วยความช่วยเหลือของวิธีแก้ปัญหาสำเร็จรูป โดยทั่วไปเราได้วิเคราะห์เพียงส่วนหนึ่งของวิธีการเท่านั้น หากคุณต้องการฉันสามารถดำเนินการต่อได้: มีอีกมากมายและพวกเขาก็สมควรได้รับความสนใจจริงๆ หากคุณมีความคิดเห็นใดๆ ว่าจะนำเสนอสิ่งนี้ได้อย่างไร โปรดเขียน - ฉันเปิดรับแนวคิดใหม่ๆ อยู่เสมอ เอกสารประกอบสำหรับวิธีการเขียนได้ดีมาก มีการเพิ่มตัวอย่างการทดสอบพร้อมผลลัพธ์ ซึ่งช่วยให้เข้าใจการทำงานของวิธีการได้ดีขึ้น ดังนั้นเราจึงไม่อายที่จะอ่านเอกสาร: มันจะขจัดข้อสงสัยของคุณเกี่ยวกับการทำงานของยูทิลิตี้นี้ เพื่อให้ได้ประสบการณ์การเขียนโค้ดใหม่ๆ ฉันแนะนำให้คุณดูวิธีการสร้างและเขียนคลาสยูทิลิตี้ สิ่งนี้จะมีประโยชน์ในอนาคต เนื่องจากโดยปกติแล้วแต่ละโปรเจ็กต์จะมีคลาสที่สนใจเป็นของตัวเอง และประสบการณ์ในการเขียนจะมีประโยชน์มาก ตามเนื้อผ้าฉันขอแนะนำให้คุณสมัครรับบัญชีของฉัน บน Github ) สำหรับผู้ที่ไม่ทราบเกี่ยวกับโครงการของฉันกับบอทโทรเลข นี่คือลิงค์ไปยังบทความแรก . ขอบคุณทุกคนที่อ่าน ฉันได้เพิ่มลิงก์ที่มีประโยชน์ด้านล่างแล้วลิงค์ที่เป็นประโยชน์ |
---|
GO TO FULL VERSION