JavaRush студенттерине коллекциялар эмне экенин жана алар эмне үчүн экенин түшүндүрүүнүн кереги жок деп ойлойм. Бирок, 8-version чыккандан кийин, мурун 6-7 сап codeду алган көптөгөн elementрдык операциялар минимумга чейин жөнөкөйлөштүрүлгөн. Бул жерде сизге көп убакытты жана мейкиндикти үнөмдөй турган эң мыкты 10 Java8 Collections Framework ыкмалары бар! Баарыңарга салам, достор! Адат, сиз билгендей, экинчи табият. Жана жазууга көнүп калгандыктан,
for (int i = 0; i <......)
мен аны такыр үйрөнгүм келбейт (айрыкча, бул дизайн абдан жөнөкөй жана түшүнүктүү болгондуктан). Бирок, циклдердин ичинде биз көбүнчө ошол эле elementрдык операцияларды кайталайбыз, алардын кайталанышынан биз чындап кутулууну каалайбыз. 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 Philosophy " автору, албетте, сонун! :)
5. Map.computeIfAbsent(K баскычы, Функция<? super K, ? V> mappingFunction кеңейтет)
Метод Картага жаңы элементти кошот , бирок ошол эле баскычка ээ элемент жок болсо гана. Функциянын аткарылышынын натыйжасыvalue
ага дайындалат mappingFunction
. Эгер мындай ачкычка ээ элемент мурунтан эле бар болсо, ал кайра жазылbyte, бирок ордунда калат. Келгиле, китептерибизге кайрылып, жаңы ыкманы колдонуп көрөлү:
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умдун кээ бир бөлүктөрү мурункуга караганда, албетте, азыраак спагеттиге окшош :) Эгер макала сизге жакса жана жаңыларын көргүңүз келсе, "Like" баскычын басып, авторду колдоону унутпаңыз же жакшыраак, "Лайк" :) Окууңарга ийгorк!
GO TO FULL VERSION