-
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
қайтару жиынын жасау үшін қолданамыз.
GO TO FULL VERSION