JavaRush /Блоги Java /Random-TG /Аз ҳалқаҳо дар Java 8 халос шудан
KapChook
Сатҳи
Volga

Аз ҳалқаҳо дар Java 8 халос шудан

Дар гурӯҳ нашр шудааст
Услуби функсионалии дар Java 8 ҷорӣшуда як иловаи олӣ ба забон аст. Ҳоло Java OOP холис нест, ҳоло он гибридии OOP ва барномасозии функсионалӣ мебошад. Ин як тағирдиҳандаи бозӣ аст ва мо бояд майнаи OOP-и худро тағир диҳем, то ин тағиротҳоро азхуд кунем. Раҳо кардани ҳалқаҳо дар Java 8 - 1Аммо чаро мо бояд ин тағйиротро қабул кунем? Чаро мо бояд вақтро барои муошират бо услуби функсионалӣ сарф кунем, вақте ки мо метавонем мушкилотро бо истифода аз OOP холис ҳал кунем?
  • Услуби функсионалии дар Java 8 ҷорӣшуда ба мо кӯмак мекунад, ки фосилаи байни мантиқи тиҷорат ва codeро кам кунем. Он ба мо имкон медиҳад, ки ҳикояро дар ҷараёни табиӣ дар сатҳи баландтар нақл кунем. Ба ҷои он ки бигӯед, ки чӣ тавр мехоҳед ин корро кунед, шумо метавонед бигӯед, ки чӣ кор кардан мехоҳед.

  • Рамз тозатар ва мухтасартар мешавад.

  • Функсияҳои баландсифат ба мо имкон медиҳанд:

    • Функсияҳоро ба дигар вазифаҳо фиристед
    • Функсияҳоро дар дохor дигар функсияҳо созед
    • Бозгашти функсияҳо аз дигар вазифаҳо

    Ин як бурди калон барои Java аст, ки мо бояд an objectҳоро барои ин кор фиристем, эҷод кунем ва баргардонем. Мо метавонем codeеро нависем, ки боэътимодтар, мутамарказ ва истифодаи дубора осонтар бошад.

  • Ба шарофати ламбдаҳо мо метавонем ҳисобҳои танбалиро анҷом диҳем. Вақте ки ифодаи лямбда ҳамчун аргументи метод фиристода мешавад, компилятор онро ҳангоми дар метод даъват кардан арзёбӣ мекунад. Ин аз далелҳои усули муқаррарӣ, ки фавран баҳо дода мешаванд, фарқ мекунад.

  • Ламбдаҳо санҷишҳои воҳиди навиштанро шавқовар мекунанд. Онҳо ба мо имкон медиҳанд, ки озмоишҳои сабукеро эҷод кунем, ки тоза, андозаи хурд ва зуд навиштан доранд. Мо метавонем рамзи зери санҷишро бо истифода аз lambdas решакан кунем. Ин ба мо имкон медиҳад, ки бисанҷем, ки чӣ гуна ҳама намуди сенарияҳо ба code таъсир мерасонанд.

  • Намунаҳои нав барои омӯхтан.

  • Ва бисёр бештар!

Аммо оби кофӣ, дар ин мақола мо ба ҳалли алтернативии давраҳои анъанавӣ назар хоҳем кард. Албатта, давраҳо чандир мебошанд, аммо ин бе нарх намеояд. break, рафтори ҳалқаро ба таври куллӣ тағир дода, моро маҷбур мекунад, ки на танҳо фаҳмем, ки code чӣ гуна ба даст овардан мехоҳад, continueбалки returnинчунин фаҳмем, ки ин ҳалқа чӣ гуна кор мекунад. Акнун мо дида мебароем, ки чӣ тавр мо метавонем ҳалқаҳоро ба codeи мухтасар ва хонданшаванда табдил диҳем.

Бигзор рамзгузорӣ оғоз шавад!

Мо бо мақолаҳо кор хоҳем кард. Мақола дорои унвон, муаллиф ва якчанд тег мебошад.
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;
    }
}
Ҳар як мисол дорои ҳалли анъанавӣ бо истифода аз ҳалқаҳо ва ҳалли бо истифода аз хусусиятҳои нави Java 8. Дар мисоли аввал, мо мехоҳем мақолаи аввалро дар маҷмӯа бо теги "Java" пайдо кунем. Биёед ҳалли худро бо истифода аз ҳалқа дида бароем.
public Article getFirstJavaArticle() {

    for (Article article : articles) {
        if (article.getTags().contains("Java")) {
            return article;
        }
    }
    return null;
}
Акнун биёед мушкилотро бо истифода аз амалиёт аз Stream API ҳал кунем.
public Optional<Article> getFirstJavaArticle() {
    return articles.stream()
        .filter(article -> article.getTags().contains("Java"))
        .findFirst();
    }
Хеле олӣ, ҳамин тавр не? Мо аввал амалиётро filterбарои пайдо кардани ҳама мақолаҳо бо теги "Java" истифода мебарем, пас мо findFirst()барои гирифтани ҳодисаи аввал истифода мебарем. Азбаски ҷараёнҳо танбаланд ва филтр ҷараёнро бармегардонад, ин равиш танҳо унсурҳоро коркард мекунад, то он даме ки мувофиқати аввал пайдо шавад. Акнун биёед ҳамаи мақолаҳоеро, ки "Java" доранд, ба ҷои мақолаи аввал. Аввал бо истифода аз ҳалқаҳо ҳалли.
public List<Article> getAllJavaArticles() {

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

    for (Article article : articles) {
        if (article.getTags().contains("Java")) {
            result.add(article);
        }
    }
    return result;
}
Ҳалли бо истифода аз амалиёти ҷараён.
public List<Article> getAllJavaArticles() {
    return articles.stream()
        .filter(article -> article.getTags().contains("Java"))
        .collect(Collectors.toList());
    }
Дар ин мисол, мо амалиётро collectбарои кӯтоҳ кардани ҷараёни натиҷавӣ истифода кардем, ба ҷои эълон кардани коллексия ва ба таври возеҳ илова кардани вурудоти мувофиқ. То ҳоло ҳамааш хуб. Вақт барои мисолҳое, ки Stream API-ро воқеан дурахшон мекунанд. Биёед ҳама мақолаҳоро аз ҷониби муаллиф гурӯҳбандӣ кунем. Мисли маъмул, мо бо ҳалли он бо истифода аз ҳалқаҳо оғоз мекунем:
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;
}
Оё мо метавонем бо истифода аз амалиёти ҷараён ҳалли тозаи ин мушкилотро пайдо кунем?
public Map<String, List<Article>> groupByAuthor() {
    return articles.stream()
        .collect(Collectors.groupingBy(Article::getAuthor));
}
Аҷиб! Бо истифода аз амалиёт groupingByва истинод ба метод getAuthor(), мо рамзи тоза ва хондашаванда мегирем. Акнун биёед боқимондаи тегҳои дар коллексия истифодашударо пайдо кунем. Биёед бо як мисоли даврӣ оғоз кунем:
public Set<String> getDistinctTags() {

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

    for (Article article : articles) {
        result.addAll(article.getTags());
    }
    return result;
}
Хуб, биёед бубинем, ки чӣ тавр мо инро бо истифода аз амалиёти ҷараён ҳал карда метавонем:
public Set<String> getDistinctTags() {
    return articles.stream()
        .flatMap(article -> article.getTags().stream())
        .collect(Collectors.toSet());
}
Хуб! flatmapба мо кӯмак мекунад, ки рӯйхати барчаспҳоро ба як ҷараёни ягонаи натиҷа ҳамвор созем, ки мо баъдан онро collectбарои сохтани маҷмӯи бозгашт истифода мебарем.

Имкониятҳои беохир

Инҳо 4 мисоле буданд, ки чӣ гуна ҳалқаҳоро бо рамзи бештар хондан иваз кардан мумкин аст. Боварӣ ҳосил кунед, ки Stream API-ро тафтиш кунед, зеро ин мақола танҳо сатҳи онро харошидааст. Азхуд кардани услуби нави функсионалии Java барои таҳиягарони OOP душвор хоҳад буд, аммо ин мушкилотест, ки бояд хуб қабул карда шавад. Ман ҳатто пештар меравам ва мегӯям, ки шумо бояд забони холиси барномасозии функсионалӣ омӯзед. Бо ин роҳ шумо метавонед қобorятҳо ва қудрати онро пурра дарк кунед. Ман фикр мекунам, ки ин ба шумо дар фаҳмидани барномасозии функсионалӣ дар сатҳи дигар кӯмак мекунад. Пас, барномасозии функсионалӣ дар якҷоягӣ бо OOP-и хуби кӯҳнаро омӯзед ва ҳардуи онҳоро барои навиштани рамзи боз ҳам бузургтар истифода баред! Омезиши ройгони тарҷумаҳои ду мақола - Чаро шумо бояд барномасозии функсионалӣ дар Java 8 ва Swerving Away аз Loops дар Java 8 -ро қабул кунед
Шарҳҳо
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION