JavaRush /Java Blog /Random-TK /“StringUtils” synpyny bozalyň

“StringUtils” synpyny bozalyň

Toparda çap edildi
Hemmelere salam, gadyrly okyjylar. Meni hakykatdanam gyzyklandyrýan we häzirki wagtda meni aladalandyrýan zatlar hakda ýazmaga synanyşýaryn. Şonuň üçin bu gün geljekde salgylanma hökmünde size peýdaly boljak ýeňil okamak bolar: geliň StringUtils hakda gürleşeliň . StringUtils synpyny bozalyň - 1Justaňy şeýle boldy, bir wagtlar Apache Commons Lang 3 kitaphanasyndan aýlanyp geçdim . Bu dürli obýektler bilen işlemek üçin kömekçi synplary bolan kitaphanadyr. Bu setirler, ýygyndylar we ş.m. bilen işlemek üçin peýdaly usullaryň ýygyndysy. 25 ýaşyndaky iş logikasyny (COBOL-dan Java-a) terjime etmek üçin setirler bilen has jikme-jik işlemeli bolýan häzirki taslamamda, StringUtils synpy hakda ýeterlik derejede bilimimiň ýokdugy ýüze çykdy . Şonuň üçin hemme zady özüm döretmeli boldum. Näme diýjek bolýanym? Setir manipulýasiýasy bilen baglanyşykly käbir meseleleri ýazmaly dälsiňiz, ýöne taýýar çözgüdi ulanyň. Özüňiz ýazmagyň näme ýalňyşlygy bar? Iň bärkisi, bu öňden bäri ýazylan has köp kod. Mundan başga-da, goşmaça ýazylan kody barlamak meselesi. Özüniň gowydygyny subut eden kitaphanany ulananymyzda, onuň eýýäm synagdan geçirilendigine we synag üçin bir topar synag hadysalaryny ýazmagymyzyň zerur däldigine garaşýarys. Java-da bir setir bilen işlemegiň usullarynyň toplumy beýle uly däl. Iş üçin peýdaly boljak usullar hakykatdanam kän däl. Bu synp, NullPointerException-yň barlaglaryny üpjün etmek üçin döredildi. Makalamyzyň mazmuny aşakdaky ýaly bolar:
  1. Nädip birikdirmeli?
  2. Işimden mysallar: nädip beýle peýdaly synp hakda bilmän, welosiped taýagymy nädip döretdim.
  3. Geliň, gyzykly gören beýleki usullara seredeliň.
  4. Gysgaça jemläliň.
Caseshli ýagdaýlar GitHub-daky Javarush Community guramasynyň aýratyn ammaryna goşular . Olar üçin aýratyn mysallar we synaglar bolar.

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:
  1. Synag, degişli düşündirişi bar bolsa, synag hökmünde serediler - @Test.
  2. 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.
  3. Synaglar ýazylanda, synaglary logiki böleklere bölýän BDD çemeleşmesini ulanýaryn:
    1. // berildi - synagdan öň maglumat gurmak bloky;
    2. // synag edýän kodumyzyň bölegi açylýan blok haçan;
    3. // soň blokyň netijeleri barlanylýan blokdyr.
Olary işletseňiz, hemme zadyň garaşylyşy ýaly işleýändigini tassyklarlar.

  • 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:
  1. ö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.

  2. 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

  3. ö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.

  4. 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

  5. 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

  • 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.
Teswirler
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION