JavaRush /Java Blog /Random-TK /Java 8-de aýlawlardan dynmak
KapChook
Dereje
Volga

Java 8-de aýlawlardan dynmak

Toparda çap edildi
Java 8-de girizilen funksional stil, dile ajaýyp goşundy. Indi Java arassa OOP däl, indi OOP we funksional programmirlemegiň gibrididir. Bu oýun çalşyjy we bu üýtgeşmeleri siňdirmek üçin OOP beýnimizi üýtgetmeli. Java 8 - 1-de aýlawlardan dynmakEmma näme üçin bu üýtgeşmeleri kabul etmeli? Meseläni arassa OOP ulanyp çözüp bilsek, näme üçin funksional stil bilen düşünişmäge synanyşmaly?
  • Java 8-de girizilen funksional stil, iş logikasy bilen koduň arasyndaky boşlugy azaltmaga kömek edýär. Hekaýany has ýokary derejede tebigy akymda gürrüň bermäge mümkinçilik berýär. Muny nädip etjekdigiňizi aýtmagyň ýerine, etjek bolýan zadyňyzy aýdyp bilersiňiz.

  • Kod has arassa we has gysga bolýar.

  • Orderokary tertipli funksiýalar:

    • Funksiýalary beýleki funksiýalara iberiň
    • Beýleki funksiýalaryň içinde funksiýalar dörediň
    • Funksiýalary beýleki funksiýalardan gaýtaryň

    Munuň üçin obýektleri ibermeli, döretmeli we yzyna gaýtarmaly Java üçin bu uly ýeňiş. Has ygtybarly, gönükdirilen we gaýtadan ulanmak aňsat bolan kod ýazyp bileris.

  • Lambdalaryň kömegi bilen ýalta hasaplamalary edip bileris. Lambda aňlatmasy usul argumenti hökmünde iberilende, düzüji usulda çagyrylanda baha berer. Bu derrew baha berilýän adaty usul argumentlerinden tapawutlanýar.

  • Lambdas ýazuw bölüminiň synaglaryny gyzykly edýär. Arassa, ululygy az we ýazmaga çalt ýeňil synaglary döretmäge mümkinçilik berýär. Synag astynda kody lambdas ulanyp kökläp bileris. Bu, her dürli ssenariýanyň koda nähili täsir etjekdigini barlamaga mümkinçilik berýär.

  • Öwrenmegiň täze nusgalary.

  • Has köp zat!

Enoughöne ýeterlik suw, bu makalada adaty siklleriň alternatiw çözgütlerine göz aýlarys. Elbetde, sikller çeýe, ýöne bu bahasyz gelmeýär. break, aýlawyň özüni alyp barşyny düýpgöter üýtgedýär, bizi diňe koduň nämä ýetjek bolýandygyna düşünmäge däl continue-de , returnaýlawyň işleýşine düşünmäge mejbur edýär. Indi aýlawlary has gysga we okalýan koda öwrüp biljekdigimize göz aýlarys.

Kodlaşdyrma başlalyň!

Makalalar bilen işläris. Makalanyň ady, awtory we birnäçe belligi bar.
private class Article {

    private final String title;
    private final String author;
    private final List<String> tags;

    private Article(String title, String author, List<String> tags) {
        this.title = title;
        this.author = author;
        this.tags = tags;
    }

    public String getTitle() {
        return title;
    }

    public String getAuthor() {
        return author;
    }

    public List<String> getTags() {
        return tags;
    }
}
Her mysalda aýlawlary ulanyp adaty çözgüt we Java 8-iň täze aýratynlyklaryny ulanyp çözgüt bolar. Birinji mysalda, ýygyndyda ilkinji makalany “Java” belligi bilen tapmak isleýäris. Aýlaw ulanyp, çözgüdi gözden geçireliň.
public Article getFirstJavaArticle() {

    for (Article article : articles) {
        if (article.getTags().contains("Java")) {
            return article;
        }
    }
    return null;
}
Indi “Stream API” operasiýalaryny ulanyp meseläni çözeliň.
public Optional<Article> getFirstJavaArticle() {
    return articles.stream()
        .filter(article -> article.getTags().contains("Java"))
        .findFirst();
    }
Gowy, şeýlemi? filterIlki bilen “Java” belligi bilen ähli makalalary tapmak üçin amaly ulanýarys , soň bolsa findFirst()ilkinji gezek ýüze çykýarys. Akymlar ýalta we süzgüç akymy yzyna gaýtaryp berýändigi sebäpli, bu çemeleşme diňe birinji gabat gelýänçä elementleri gaýtadan işlär. Indi diňe birinjisiniň ýerine “Java” bellikli makalalary alalyň. Ilki bilen aýlawlary ulanyp çözgüt.
public List<Article> getAllJavaArticles() {

    List<Article> result = new ArrayList<>();

    for (Article article : articles) {
        if (article.getTags().contains("Java")) {
            result.add(article);
        }
    }
    return result;
}
Akym amallaryny ulanmak arkaly çözgüt.
public List<Article> getAllJavaArticles() {
    return articles.stream()
        .filter(article -> article.getTags().contains("Java"))
        .collect(Collectors.toList());
    }
collectBu mysalda, kolleksiýa yglan etmek we gabat gelýän ýazgylary aç-açan goşmak däl-de, emele gelen akymy gysgaltmak üçin bir operasiýa ulandyk . Häzirlikçe gaty gowy. “Stream API” -ni hakykatdanam ýagtylandyrjak mysallar üçin wagt. Geliň, ähli makalalary awtoryň toparlaryna bölýäris. Hemişe bolşy ýaly, aýlawlary ulanyp çözýäris:
public Map<String, List<Article>> groupByAuthor() {

    Map<String, List<Article>> result = new HashMap<>();

    for (Article article : articles) {
        if (result.containsKey(article.getAuthor())) {
            result.get(article.getAuthor()).add(article);
        } else {
            ArrayList<Article> articles = new ArrayList<>();
            articles.add(article);
            result.put(article.getAuthor(), articles);
        }
    }
    return result;
}
Akym amallaryny ulanyp, bu meseläniň arassa çözgüdini tapyp bilerismi?
public Map<String, List<Article>> groupByAuthor() {
    return articles.stream()
        .collect(Collectors.groupingBy(Article::getAuthor));
}
Geň galdyryjy! groupingByAmal we usul salgylanmasy ulanyp getAuthor(), arassa we okalýan kod alýarys. Indi ýygyndyda ulanylýan bellikleriň galan bölegini tapalyň. Geliň, aýlawly mysal bilen başlalyň:
public Set<String> getDistinctTags() {

    Set<String> result = new HashSet<>();

    for (Article article : articles) {
        result.addAll(article.getTags());
    }
    return result;
}
Bolýar, akym amallaryny ulanyp muny nädip çözüp boljakdygyna göz aýlalyň:
public Set<String> getDistinctTags() {
    return articles.stream()
        .flatMap(article -> article.getTags().stream())
        .collect(Collectors.toSet());
}
Salkyn! flatmapbellikleriň sanawyny ýekeje netije akymyna düzmäge kömek edýär, soň bolsa collectyzyna gaýtarmak toplumyny döretmek üçin ulanýarys.

Tükeniksiz mümkinçilikler

Bular aýlawlary has okalýan kod bilen çalyşmagyň 4 mysalydy. “Stream API” -ni gözden geçiriň, sebäbi bu makala diňe ýüzüni çyzdy. Java-yň täze funksional stilini özleşdirmek OOP döredijiler üçin kyn bolar, ýöne gowy garşylanmaly. Hatda has öňe gidip, arassa funksional programmirleme dilini öwrenmelidigiňizi aýdaryn. Şeýlelik bilen, onuň berýän mümkinçiliklerine we güýjüne doly düşünip bilersiňiz. Bu, başga bir derejede funksional programmirleme düşünmäge kömek eder diýip pikir edýärin. Şonuň üçin gowy köne OOP bilen bilelikde funksional programmirlemegi öwreniň we ikisindenem has uly kod ýazmak üçin ulanyň! Iki makalanyň mugt terjimesi - Näme üçin Java 8-de funksional programmirlemäni kabul etmeli we Java 8-de Loops from Swerving Away
Teswirler
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION