- Nädip birikdirmeli?
- Işimden mysallar: nädip beýle peýdaly synp hakda bilmän,
welosipedtaýagymy nädip döretdim. - Geliň, gyzykly gören beýleki usullara seredeliň.
- Gysgaça jemläliň.
0. Nädip birikdirmeli
Meniň bilen elleşýänler Git we Maven bilen eýýäm has az tanyş, şonuň üçin mundan beýläk bu bilime bil baglaryn we özümi gaýtalamaryn. Öňki makalalarymy ýitiren ýa-da ýaňy okap başlanlar üçin ine, Maven we Git hakda materiallar . Elbetde, gurluşyk ulgamy bolmazdan (Maven, Gredl) hemme zady el bilen birikdirip bilersiňiz, ýöne häzirki döwürde bu däli we hökman beýle etmeli dälsiňiz: hemme zady nädip dogry etmelidigini derrew öwrenmek has gowudyr. Şonuň üçin Maven bilen işlemek üçin ilki bilen degişli garaşlylygy goşýarys:<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>${apache.common.version}</version>
</dependency>
Bu ýerde $ {apache.common.version} bu kitaphananyň wersiýasy. Ondan soň, käbir synplara import etmek üçin import goşuň:
import org.apache.commons.lang3.StringUtils;
Ine, hemmesi sumkada))
1. Hakyky taslamadan mysallar
- leftPad usuly
Ilkinji mysal, häzirki wagtda gaty samsyk ýaly bolup görünýär, kärdeşlerimiň StringUtils.leftPad hakda bilip , maňa aýdanlary gaty gowy. Wezipe näme: kod şeýle bir guruldy welin, maglumatlar gaty dogry gelmese maglumatlary üýtgetmek zerur boldy. Setir meýdany diňe sanlardan ybarat bolmaly diýlip garaşylýar. uzynlygy 3 bolsa we bahasy 1 bolsa, ýazgy “001” bolmaly. .Agny, ilki bilen ähli boşluklary aýyrmaly, soň bolsa nol bilen ýapmaly. Işiň düýp manysyny aýdyňlaşdyrmak üçin has köp mysal: “12” -> “012” -den “1” -> “001” we ş.m. Men näme etdim? Muny “LeftPadExample” synpynda beýan etdi . Bularyň hemmesini etjek bir usul ýazdym:
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();
}
Esasan, asyl bilen kesilen bahanyň arasyndaky tapawudy alyp, öňündäki nollar bilen dolduryp bileris diýen pikiri aldym. Munuň üçin IntStream-i şol bir gezek n gezek ýerine ýetirmek üçin ulandym . Bu hökman synagdan geçirilmeli. Ine, StringUtils.leftPad usuly barada öňünden bilsedim näme edip bilerdim :
public static String apacheCommonLeftPad(String value) {
return StringUtils.leftPad(value.trim(), value.length(), "0");
}
Görşüňiz ýaly, kod gaty az we hemmeler tarapyndan tassyklanan kitaphana hem ulanylýar. Bu maksat bilen, “LeftPadExampleTest” synpynda iki synag döretdim (köplenç bir synp synamagy meýilleşdirenlerinde, şol bir paketde diňe src / test / java-da şol bir at bilen synag döredýärler). Bu synaglar, bahanyň dogry, soňra başga biriniň dogry üýtgemegine göz ýetirmek üçin bir usuly barlaýar. Elbetde, has köp synag ýazylmalydy, ýöne synag biziň üçin esasy tema däl:
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);
}
}
Synaglar barada häzirlikçe birnäçe teswir berip bilerin. JUnit 5 ulanyp ýazylýar:
- Synag, degişli düşündirişi bar bolsa, synag hökmünde serediler - @Test.
- Synagyň işini suratlandyrmak kyn bolsa ýa-da düşündiriş uzyn we okamak üçin amatsyz bolsa, @DisplayName düşündirişini goşup, synaglar geçirilende görünjek adaty düşündiriş edip bilersiňiz.
- Synaglar ýazylanda, synaglary logiki böleklere bölýän BDD çemeleşmesini ulanýaryn:
- // berildi - synagdan öň maglumat gurmak bloky;
- // synag edýän kodumyzyň bölegi açylýan blok haçan;
- // soň blokyň netijeleri barlanylýan blokdyr.
- stripStart usuly
Bu ýerde başda boşluklar we dyngy bolup bilýän setir bilen bir meseläni çözmeli boldum. Üýtgedip gurmakdan soň, olaryň täze manysy bolmaly däldi. Mesele beýany öňküsinden has düşnükli. Birnäçe mysal biziň düşünişimizi güýçlendirer: “,, kitaplar” -> “kitaplar” “,,, kitaplar” -> “kitaplar” b, kitaplar ”->“ b, kitaplar ”leftPad-da bolşy ýaly, goşdum Iki usuly bolan StrimStartExample synpy. Biri - öz çözgüdi bilen:
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);
}
Bu ýerde pikir, boşluk ýa-da dyngysyz indeks tapmakdy. Başda düýbünden ýok bolsa, indeks nola deň bolar. Ikinjisi - StringUtils arkaly çözgüt bilen :
public static String apacheCommonLeftPad(String value) {
return StringUtils.stripStart(value, StringUtils.SPACE + COMMA);
}
Bu ýerde haýsy setir bilen işleýändigimiz barada ilkinji argument maglumatlary berýäris, ikinjisinde bolsa geçmeli nyşanlardan ybarat bir setir geçýäris. “StripStartExampleTest” synpyny şol bir görnüşde döredýäris :
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);
}
}
- boş usul
Bu usul, elbetde has ýönekeý, ýöne bu ony has peýdaly etmeýär. String.isEmpty () usulynyň mümkinçiliklerini giňeldýär , bu hem null üçin çek goşýar. Näme üçin? NullPointerException-dan gaça durmak üçin, ýagny üýtgeýjä jaň etmegiň usullaryndan gaça durmak . Şonuň üçin ýazmazlyk üçin:
if(value != null && value.isEmpty()) {
//doing something
}
Muny ýönekeý edip bilersiňiz:
if(StringUtils.isEmpty(value)) {
//doing something
}
Bu usulyň artykmaçlygy, haýsy usulyň ulanylýandygyny derrew anyklamakdyr.
2. StringUtils synpynyň beýleki usullarynyň derňewi
Indi, meniň pikirimçe, ünsi çekmeli şol usullar barada gürleşeliň. Umuman , “StringUtils” barada aýdanymyzda, “String” synpynda tapylanlara meňzeş (“ IsEmpty” usulyndaky ýaly ) ygtybarly usullary üpjün edýändigini aýtmalydyrys . Geliň, olaryň üstünden geçeliň:
- usulyny deňeşdiriň
Şeýle usul Stringde bar we iki setiri deňeşdireniňde, biri null bolsa, NullPointerException atar. Kodumyzdaky ýigrenji barlaglardan gaça durmak üçin StringUtils.compare (String str1, String str2) usulyny ulanyp bileris : deňeşdirmegiň netijesinde int-i yzyna gaýtaryp berýär. Bu gymmatlyklar näme many berýär? int = 0 birmeňzeş bolsa (ýa-da ikisi hem null). int <0, eger str1 str2-den az bolsa. int> 0, eger str1 str2-den uly bolsa. Şeýle hem, olaryň resminamalaryna seretseňiz, bu usulyň Javadoc aşakdaky ssenariýalary görkezýär:
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
- usullaryny öz içine alýar
Bu ýerde kömekçi işläp düzüjilerde partlama boldy. Islän usulyňyz şol ýerde. Olary bir ýere jemlemegi makul bildim:
-
öz içine alýar , garaşylýan setiriň başga bir setirde bardygyny ýa-da ýokdugyny barlaýan usul. Bu nähili peýdaly? Tekstde belli bir sözüň bardygyna göz ýetirmek zerur bolsa, bu usuly ulanyp bilersiňiz.
Mysallar:
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
Againene-de NPE (Null Pointer Expression) howpsuzlygy bar.
içindeAny, setirde görkezilen nyşanlaryň haýsydyr biriniň bardygyny ýa-da ýokdugyny barlaýan usul. Şeýle hem peýdaly zat: muny köplenç etmeli. Resminamalardan mysallar:
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
-
öz içine alýanIgnoreCase, öz içine alýan usula peýdaly giňeltme . Hakykatdanam, şeýle usuly bu usulsyz barlamak üçin birnäçe wariantdan geçmeli bolarsyňyz. Şonuň üçin diňe bir usul sazlaşykly ulanylar.
-
containsNone - adyna görä, barlanylýan zatlara eýýäm düşünip bilersiňiz. Içinde setirler bolmaly däldir. Elbetde peýdaly zat. Käbir islenmeýän nyşanlary çalt gözlemek;). Telegram botumyzda ahlaksyzlyklary süzeris we bu gülkünç usullary äsgermezlik ederis.
Mysallar, olar bolmasa nirede bolardyk:
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
Dokumentlerden birnäçe mysal:
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 usuly
Setir boş bolsa we goşmaça baha goşmazlyga kömek edýän usullaryň tapgyry. Her tagamyna laýyk gelýän köp wariant bar. Olaryň arasynda esasy zat StringUtils.defaultString (jemleýji setir str, soňky setir defoltStr) - str ýok bolsa, bahany defaultStr- e geçireris . Resminamalardan mysallar:
StringUtils.defaultString(null, "NULL") = "NULL"
StringUtils.defaultString("", "NULL") = ""
StringUtils.defaultString("bat", "NULL") = "bat"
Maglumatlar bilen POJO synpyny döredeniňizde ulanmak gaty amatly.
- DeleteWhitespace usuly
Ony ulanmak üçin köp wariant bolmasa-da, bu gyzykly usul. Şol bir wagtyň özünde, şeýle ýagdaý ýüze çyksa, usul hökman gaty peýdaly bolar. Setirdäki ähli boşluklary aýyrýar. Bu boşluk nirede bolsa, onuň yzy bolmaz))) Dokumentlerden mysallar:
StringUtils.deleteWhitespace(null) = null
StringUtils.deleteWhitespace("") = ""
StringUtils.deleteWhitespace("abc") = "abc"
StringUtils.deleteWhitespace(" ab c ") = "abc"
- endWith usuly bilen
Özi üçin gürleýär. Bu örän peýdaly usul: setiriň teklip edilýän setir bilen gutarýandygyny ýa-da ýokdugyny barlaýar. Bu köplenç zerurdyr. Elbetde, çeki özüňiz ýazyp bilersiňiz, ýöne taýýar usuly ulanmak has amatly we has gowudyr. Mysallar:
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
Görşüňiz ýaly, hemme zat boş setir bilen gutarýar))) Bu mysal (StringUtils.endsWith ("ABCDEF", "") = dogry) diňe bir bonus, sebäbi bu manysyz) Şeýle hem bir usul bar kazyýet işine ähmiýet bermeýär.
- deňdir
Iki setiri deňeşdirýän null howpsuz usulyň ajaýyp mysaly. Ol ýere näme goýsak-da, jogap şol ýerde bolar we ýalňyşsyz bolar. Mysallar:
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
Elbetde, deňIgnoreCase hem bar - hemme zat edil şol bir görnüşde edilýär, diňe bu meselä ähmiýet bermeýäris. Göreli?
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
- Her usul bilen deňdir
Geliň, deň usuly giňeldeliň . Birnäçe deňlik barlagynyň ýerine, birini ýerine ýetirmek isleýäris diýeliň. Munuň üçin setirler toplumy deňeşdiriljek bir setiri geçip bileris, eger haýsydyr biri teklip edilýän birine deň bolsa, HAKYKAT bolar. Biri-biri bilen deňeşdirmek üçin bir setir we setirler ýygyndysyny geçirýäris (kolleksiýadaky setirler bilen birinji setir). Kynmy? Ine, nämäni aňladýandygyna düşünmek üçin resminamalardan mysallar:
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
Şeýle-de deňAnyIgnoreCase bar . Munuň üçin mysallar:
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
Aşakdaky setir
Netijede, “StringUtils” -iň nämedigini we haýsy peýdaly usullarynyň bardygyny bilmek bilen gidýäris. Şeýle peýdaly zatlaryň bardygyna we her gezek taýyn çözgüdiň kömegi bilen meseläni ýapyp boljak ýerlerde taýak bilen berkitmegiň zerurlygynyň ýokdugyna göz ýetirmek bilen. Umuman, usullaryň diňe bir bölegini analiz etdik. Isleseňiz, dowam edip bilerin: olaryň köpüsi bar we olar hakykatdanam ünsi çekmelidir. Başga nädip hödürlenip biljekdigi barada pikirleriňiz bar bolsa ýazmagyňyzy haýyş edýärin - men hemişe täze pikirlere açyk. Usullar üçin resminamalar gaty gowy ýazylypdyr, netijeler bilen synag mysallary goşulýar, bu usulyň işleýşine has gowy düşünmäge kömek edýär. Şonuň üçin resminamalary okamakdan çekinmeris: bu peýdaly enjamyň işleýşine bolan şübheleriňizi ýok eder. Kodlaşdyrmagyň täze tejribesini gazanmak üçin, peýdaly sapaklaryň nähili ýazylýandygyna we ýazylmagyna göz aýlamagy maslahat berýärin. Bu geljekde peýdaly bolar, sebäbi adatça her taslamanyň öz bölekleri bar we olary ýazmak tejribesi peýdaly bolar. Däp bolşy ýaly, Github-daky hasabyma ýazylmagyňyzy maslahat berýärin ) Telegram boty bilen taslamam hakda bilmeýänler üçin, birinji makalanyň baglanyşygy . Hemmäňize okanyňyz üçin sag boluň. Aşakda käbir peýdaly baglanyşyklary goşdum.peýdaly baglanyşyklar |
---|
GO TO FULL VERSION