JavaRush /Java блогы /Random-KK /Java 8-де циклдардан құтылу
KapChook
Деңгей
Volga

Java 8-де циклдардан құтылу

Топта жарияланған
Java 8-де енгізілген функционалдық стиль тілге тамаша қосымша болып табылады. Қазір Java таза OOP емес, енді ол OOP және функционалдық бағдарламалаудың гибриді болып табылады. Бұл ойынды өзгертуші және біз осы өзгерістерді қабылдау үшін OOP миымызды өзгертуіміз керек. Java 8 - 1 ілмектерінен құтылуБірақ неге біз бұл өзгерістерді қабылдауымыз керек? Мәселені таза OOP көмегімен шеше алатын болсақ, неге біз функционалдық стильмен тіл табысуға уақытты жоғалтуымыз керек?
  • Java 8-де енгізілген функционалдық стиль бизнес логикасы мен code арасындағы алшақтықты азайтуға көмектеседі. Бұл бізге оқиғаны табиғи ағымда жоғары деңгейде айтуға мүмкіндік береді. Қалай істегіңіз келетінін айтудың орнына, сіз не істегіңіз келетінін айта аласыз.

  • Код таза және қысқарақ болады.

  • Жоғары ретті функциялар бізге мүмкіндік береді:

    • Функцияларды басқа функцияларға жіберу
    • Басқа функциялардың ішінде функцияларды жасаңыз
    • Басқа функциялардан функцияларды қайтару

    Бұл Java үшін үлкен жеңіс, мұнда мұны істеу үшін нысандарды жіберу, жасау және қайтару қажет. Біз сенімдірек, бағдарланған және қайта пайдалану оңайырақ codeты жаза аламыз.

  • Ламбдалардың арқасында біз жалқау есептеулер жасай аламыз. Ламбда өрнегі әдіс аргументі ретінде жіберілгенде, компилятор әдісте шақырылған кезде оны бағалайды. Бұл бірден бағаланатын қалыпты әдіс аргументтерінен ерекшеленеді.

  • Ламбдалар жазу блогының сынақтарын қызықты етеді. Олар бізге таза, көлемі шағын және тез жазылатын жеңіл сынақтарды жасауға мүмкіндік береді. Біз лямбдаларды пайдаланып сынақтан өтіп жатқан codeты жоюға болады. Бұл барлық сценарий түрлерінің 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()біз таза және оқылатын code аламыз. Енді жинақта қолданылған тегтердің қалғанын табайық. Цикл мысалынан бастайық:
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қайтару жиынын жасау үшін қолданамыз.

Шексіз мүмкіндіктер

Бұл циклдарды оқуға болатын codeпен ауыстырудың 4 мысалы болды. Stream API-ді тексеріңіз, себебі бұл мақала тек бетін сызып тастады. Java-ның жаңа функционалдық стилін меңгеру OOP әзірлеушілері үшін қиын болады, бірақ оны жақсы қабылдау керек. Мен тіпті ары қарай жүріп, таза функционалды бағдарламалау тілін үйрену керек деп айтамын. Осылайша сіз оның мүмкіндіктері мен қуатын толық түсіне аласыз. Бұл функционалдық бағдарламалауды басқа деңгейде түсінуге көмектеседі деп ойлаймын. Сондықтан ескі жақсы OOP-пен бірге функционалдық бағдарламалауды үйреніңіз және олардың екеуін де одан да үлкен code жазу үшін пайдаланыңыз! Екі мақаланың аудармаларының тегін қоспасы - Неліктен Java 8-де функционалдық бағдарламалауды және Java 8-де Swerving Away from Loops бағдарламасын қабылдау керек
Пікірлер
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION