Менің ойымша, JavaRush студенттеріне қандай жинақтар және олар не үшін қажет екенін түсіндірудің қажеті жоқ. Дегенмен, 8-ші нұсқа шыққаннан кейін, бұрын 6-7 жол codeты алатын көптеген қарапайым операциялар минимумға дейін жеңілдетілді. Әрі қарай созбай, мұнда сізге көптеген уақыт пен кеңістікті үнемдейтін Java8 Collections Framework ең жақсы 10 техникасы берілген! Барлығына сәлем, достар! Өздеріңіз білетіндей, әдет – екінші табиғат. Жазуға үйренгендіктен,
for (int i = 0; i <......)
мен оны мүлдем қайта үйренгім келмейді (әсіресе бұл дизайн өте қарапайым және түсінікті). Дегенмен, ішкі циклдар біз жиі қайталанатын қарапайым операцияларды қайталаймыз, олардың қайталануынан құтылғымыз келеді. Java8 шығарылымымен Oracle бізге көмектесуді шешті. Төменде сізге көп уақыт пен codeты үнемдейтін 10 ең жақсы жинау әдісі берілген.
1. Iterable.forEach(Consumer<? super T> әрекеті)
Аты өзі үшін сөйлейді. Өткізілген жинақ арқылы қайталайды жәнеaction
әрбір элемент үшін ламбда өрнегін орындайды.
List <Integer> numbers = new ArrayList<>(Arrays.asList(1,2,3,4,5,6,7));
numbers.forEach(s -> System.out.print(s + " "));
1 2 3 4 5 6 7
2. Collection.removeIf(Predicate<? super E> сүзгісі)
Ештеңе де күрделі емес. Әдіс жинақ арқылы қайталанады және сәйкес келетін элементтерді жоядыfilter
.
List <Integer> numbers = new ArrayList<>(Arrays.asList(1,2,3,4,5,6,7));
numbers.removeIf(s -> s > 5);
numbers.forEach(s -> System.out.print(s + " "));
Бір жолда біз тізімнен 5-тен жоғары барлық сандарды алып тастаймыз.
3. Map.forEach(BiConsumer<? super K, ? super V> әрекеті)
ӘдісforEach
интерфейсті жүзеге асыратын сыныптар үшін ғана емес Collection
, сонымен қатар жұмыс істейді Map
.
Map <String, String> books = new HashMap<>();
books.put("Война и мир", "Лев Толстой");
books.put("Преступление и наказание", "Федор Достоевский");
books.put("Философия Java", "Брюс Эккель");
books.put("Братья Карамазовы", "Федор Достоевский");
books.put("Властелин Колец", "Джон Толкин");
books.forEach((a,b) -> System.out.println("Название книги: " + a + ". Author: " + b));
Название книги: Братья Карамазовы. Author: Федор Достоевский
Название книги: Философия Java. Author: Брюс Эккель
Название книги: Преступление и наказание. Author: Федор Достоевский
Название книги: Война и мир. Author: Лев Толстой
Название книги: Властелин Колец. Author: Джон Толкин
4. Map.compute(K пернесі, BiFunction<? super K, ? super V, ? V> remappingFunction кеңейтеді)
Бұл аздап қорқытатын көрінеді, бірақ іс жүзінде бұл барлық алдыңғылар сияқты қарапайым. Көрсетілген кілт үшінkey
бұл әдіс функцияның нәтижесіне мән орнатады remappingFunction
. Мысалы:
Map <String, String> books = new HashMap<>();
books.put("Война и мир", "Лев Толстой");
books.put("Преступление и наказание", "Федор Достоевский");
books.put("Философия Java", "Брюс Эккель");
books.put("Братья Карамазовы", "Федор Достоевский");
books.put("Властелин Колец", "Джон Толкин");
books.forEach((a,b) -> System.out.println("Название книги: " + a + ". Author: " + b));
books.compute("Философия Java", (a,b) -> b+", крутой чувак");
System.out.println("_______________________");
books.forEach((a,b) -> System.out.println("Название книги: " + a + ". Author: " + b));
Название книги: Братья Карамазовы. Author: Федор Достоевский
Название книги: Философия Java. Author: Брюс Эккель
Название книги: Преступление и наказание. Author: Федор Достоевский
Название книги: Война и мир. Author: Лев Толстой
Название книги: Властелин Колец. Author: Джон Толкин
_______________________
Название книги: Братья Карамазовы. Author: Федор Достоевский
Название книги: Философия Java. Author: Брюс Эккель, крутой чувак
Название книги: Преступление и наказание. Author: Федор Достоевский
Название книги: Война и мир. Author: Лев Толстой
Название книги: Властелин Колец. Author: Джон Толкин
« Java философиясының » авторы сөзсіз тамаша! :)
5. Map.computeIfAbsent(K пернесі, Функция<? супер K, ? V> mappingFunction кеңейтеді)
Әдіс Map қолданбасына жаңа элемент қосады , бірақ сол кілті бар элемент ол жерде болмаса ғана. Оған функцияның орындалу нәтижесіvalue
тағайындалады mappingFunction
. Егер мұндай кілті бар элемент бұрыннан бар болса, ол қайта жазылмайды, бірақ орнында қалады. Кітаптарымызға оралып, жаңа әдісті қолданып көрейік:
Map <String, String> books = new HashMap<>();
books.put("Война и мир", "Лев Толстой");
books.put("Преступление и наказание", "Федор Достоевский");
books.put("Философия Java", "Брюс Эккель");
books.put("Братья Карамазовы", "Федор Достоевский");
books.put("Властелин Колец", "Джон Толкин");
books.computeIfAbsent("Гарри Поттер и узник Азкабана", b -> getHarryPotterAuthor());
books.forEach((a,b) -> System.out.println("Название книги: " + a + ". Author: " + b));
Біздің функциямыз mappingFunction
:
public static String getHarryPotterAuthor() {
return "Джоан Роулинг";
}
Міне, жаңа кітап:
Название книги: Братья Карамазовы. Author: Федор Достоевский
Название книги: Философия Java. Author: Брюс Эккель
Название книги: Преступление и наказание. Author: Федор Достоевский
Название книги: Война и мир. Author: Лев Толстой
Название книги: Гарри Поттер и узник Азкабана. Author: Джоан Роулинг
Название книги: Властелин Колец. Author: Джон Толкин
6. Map.computeIfPresent(K пернесі, BiFunction<? super K, ? super V, ? V> remappingFunction кеңейтеді)
принципімен бірдей,Map.compute()
бірақ барлық есептеулер кілті бар элемент бұрыннан бар болса ғана орындалады key
.
Map <String, String> books = new HashMap<>();
books.put("Война и мир", "Лев Толстой");
books.put("Преступление и наказание", "Федор Достоевский");
books.put("Философия Java", "Брюс Эккель");
books.put("Братья Карамазовы", "Федор Достоевский");
books.put("Властелин Колец", "Джон Толкин");
books.computeIfPresent("Евгений Онегин", (a,b) -> b="Александр Пушкин");
System.out.println("_________________");
books.forEach((a,b) -> System.out.println("Название книги: " + a + ". Author: " + b));
books.computeIfPresent("Братья Карамазовы", (a,b) -> b="Александр Пушкин");
System.out.println("_________________");
books.forEach((a,b) -> System.out.println("Название книги: " + a + ". Author: " + b));
Функция алғаш рет шақырылған кезде ешқандай өзгерістер болған жоқ, өйткені Map
бізде «Евгений Онегин» деген кітап жоқ. Бірақ бағдарлама екінші рет «Ағайынды Карамазовтар» кітабының авторын «Александр Пушкинге» ауыстырды. Қорытынды:
_________________
Название книги: Братья Карамазовы. Author: Федор Достоевский
Название книги: Философия Java. Author: Брюс Эккель
Название книги: Преступление и наказание. Author: Федор Достоевский
Название книги: Война и мир. Author: Лев Толстой
Название книги: Властелин Колец. Author: Джон Толкин
_________________
Название книги: Братья Карамазовы. Author: Александр Пушкин
Название книги: Философия Java. Author: Брюс Эккель
Название книги: Преступление и наказание. Author: Федор Достоевский
Название книги: Война и мир. Author: Лев Толстой
Название книги: Властелин Колец. Author: Джон Толкин
7. Map.getOrDefault(Нысан пернесі, V defaultValue)
Кілтке сәйкес мәнді қайтарадыkey
. Егер мұндай кілт жоқ болса, әдепкі мәнді қайтарады.
Map <String, String> books = new HashMap<>();
books.put("Война и мир", "Лев Толстой");
books.put("Преступление и наказание", "Федор Достоевский");
books.put("Философия Java", "Брюс Эккель");
books.put("Братья Карамазовы", "Федор Достоевский");
books.put("Властелин Колец", "Джон Толкин");
String igor = books.getOrDefault("Слово о полку Игореве", "Неизвестный автор");
System.out.println(igor);
Өте ыңғайлы:
Неизвестный автор
8. Map.merge(K пернесі, V мәні, BiFunction<? super V, ? super V, ? V> remappingFunction кеңейтеді)
Мен бұл әдіс сізді қанша code жолын үнемдейтінін есептеуге тырыспадым.Map
Егер кілт сіздікіkey
болмаса немесеvalue
бұл кілт үшін ол тең болса ,null
әдіс қосады .Map
key-value
- Егер кілт
Key
бар болса және ол бар болса,value != null
әдіс оныvalue
берілген функцияны орындау нәтижесіне өзгертедіremappingFunction
. - Егер
remappingFunction
ол қайтарсаnull
,key
ол жинақтан жойылады.
Map <String, String> books = new HashMap<>();
books.put("Война и мир", "Лев Толстой");
books.put("Преступление и наказание", "Федор Достоевский");
books.put("Философия Java", "Брюс Эккель");
books.put("Братья Карамазовы", "Федор Достоевский");
books.put("Властелин Колец", "Джон Толкин");
books.merge("Философия Java", "Брюс Эккель", (a, b) -> b + " и кто-то там еще");
books.forEach((a,b) -> System.out.println("Название:" + a + ". Author: " + b));
Қорытынды:
Название:Братья Карамазовы. Author: Федор Достоевский
Название:Философия Java. Author: Брюс Эккель и кто-то там еще
Название:Преступление и наказание. Author: Федор Достоевский
Название:Война и мир. Author: Лев Толстой
Название:Властелин Колец. Author: Джон Толкин
*кешіріңіз Брюс*
9. Map.putIfAbsent(K пернесі, V мәні)
Бұрын жұпты қосу үшін,Map
егер ол жоқ болса, келесі әрекеттерді орындау керек болды:
Map <String, String> map = new HashMap<>();
if (map.get("Властелин Колец") == null)
map.put("Властелин Колец", "Джон Толкин");
Енді бәрі әлдеқайда қарапайым болды:
Map<String, String> map = new HashMap<>();
map.putIfAbsent("Властелин Колец", "Джон Толкин");
10. Map.replace және Map.replaceAll()
Тізімдегі соңғы, бірақ кем емес.Map.replace(K key, V newValue
— кілт мәнін ауыстырады key
, newValue
егер мұндай кілт бар болса. Олай болмаса, ештеңе болмайды. Map.replace(K key, V oldValue, V newValue)
- бірдей әрекетті жасайды, бірақ ағымдағы мән болса key
ғана oldValue
. Map.replaceAll(BiFunction<? super K, ? super V, ? extends V> function)
— барлық мәндерді value
функцияның орындалу нәтижесімен ауыстырады function
. Мысалы:
Map <String, String> books = new HashMap<>();
books.put("Война и мир", "Лев Толстой");
books.put("Преступление и наказание", "Федор Достоевский");
books.put("Философия Java", "Брюс Эккель");
books.put("Братья Карамазовы", "Федор Достоевский");
books.put("Властелин Колец", "Джон Толкин");
books.replace("Братья Карамазовы", "Брюс Эккель", "Джон Толкин");
books.forEach((a,b) -> System.out.println("Название:" + a + ". Author: " + b));
Название:Братья Карамазовы. Author: Федор Достоевский
Название:Философия Java. Author: Брюс Эккель
Название:Преступление и наказание. Author: Федор Достоевский
Название:Война и мир. Author: Лев Толстой
Название:Властелин Колец. Author: Джон Толкин
Жұмыс істемеді! Ағайынды Карамазовтар кілтінің қазіргі құны Брюс Эккел емес Федор Достоевский, сондықтан ештеңе өзгерген жоқ.
Map <String, String> books = new HashMap<>();
books.put("Война и мир", "Лев Толстой");
books.put("Преступление и наказание", "Федор Достоевский");
books.put("Философия Java", "Брюс Эккель");
books.put("Братья Карамазовы", "Федор Достоевский");
books.put("Властелин Колец", "Джон Толкин");
books.replaceAll((a,b) -> getCoolWriter());
books.forEach((a,b) -> System.out.println("Название:" + a + ". Author: " + b));
public static String getCoolWriter() {
return "Крутой писатель";
}
Название:Братья Карамазовы. Author: Крутой писатель
Название:Философия Java. Author: Крутой писатель
Название:Преступление и наказание. Author: Крутой писатель
Название:Война и мир. Author: Крутой писатель
Название:Властелин Колец. Author: Крутой писатель
Бүкіл Картаның мәндерін күрделі конструкцияларсыз оңай өзгертіңіз! PS Жаңа нәрсеге үйрену әрқашан қиын, бірақ бұл өзгерістер шынымен жақсы. Қалай болғанда да, менің codeымның кейбір бөліктері бұрынғыға қарағанда спагеттиге ұқсамайды :) Егер сізге мақала ұнаса және жаңаларын көргіңіз келсе, «Ұнату» түймесін басу арқылы авторды қолдауды ұмытпаңыз немесе жақсырақ, «Лайк» :) Оқуларыңызға сәттілік!
GO TO FULL VERSION