JavaRush /Java блогу /Random-KY /Жазууну токтоткула! Java 8 коллекциялары менен иштөөнүн э...
Джон Дориан
Деңгээл

Жазууну токтоткула! Java 8 коллекциялары менен иштөөнүн эң мыкты 10 ыкмасы

Группада жарыяланган
JavaRush студенттерине коллекциялар эмне экенин жана алар эмне үчүн экенин түшүндүрүүнүн кереги жок деп ойлойм. Бирок, 8-version чыккандан кийин, мурун 6-7 сап codeду алган көптөгөн elementрдык операциялар минимумга чейин жөнөкөйлөштүрүлгөн. Бул жерде сизге көп убакытты жана мейкиндикти үнөмдөй турган эң мыкты 10 Java8 Collections Framework ыкмалары бар! Жазууну токтоткула!  Java 8 коллекциялары менен иштөөнүн эң мыкты 10 ыкмасы - 1Баарыңарга салам, достор! Адат, сиз билгендей, экинчи табият. Жана жазууга көнүп калгандыктан, 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ыкма кошумчалайт .Mapkey-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к!
Комментарийлер
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION