Не так давно дійшли руки до розгляду Java 8. Після ознайомлення з Java 8 Tutorial і Java 8 Stream Tutorial цікаво стало поексперементувати і зрозуміти, чого нам чекати від фундаментальних нововведень, а також - чи зможуть вони хоч якось спростити і без того нелегку долю автоматизаторів. З детальними результатами експерименту можна ознайомитися в моєму блозі.
Почнемо мабуть з прикладу, який був приведений в одній з недавніх тем. Всі ми так чи інакше стикалися з проблемами очікувань будь-яких елементів на сторінці. В якості одного з можливих рішень може виступити реалізація кастомними findElement:
findElement.png 986x221 15.1 KB
Тут ми використовуємо лише одна умова - ExpectedConditions.visibilityOfElementLocated. Для common сценаріїв цього може бути цілком достатньо. Але от якщо нам буде потрібно щось універсальне, то без велосипедів явно не обійтися.
funcInt.png 1337x269 20 KB
Власне, крім локатора і таймаута, на вхід подається функція 1 input (By) / 1 output (ExpectedCondition
Якщо ми уважно придивимося до сигнатурі і типу значення, що повертається найцікавіших методів класу ExpectedConditions. ми помітимо, що вони ідеально підходять нашій функції. Як підсумок, за допомогою спеціального символу :: ми можемо послатися на статичні методи потрібного нам класу, і передати їх в якості одного з параметрів findElement.
Це і є так звані methods 'references. До слова, ми можемо використовувати посилання не тільки на статичні методи, але і звертатися до методів конкретних об'єктів. Наскільки простіше стало писати універсальні методи, чи не так?
Крім цього, ви напевно помітили не менш цікаву конструкцію - Optional. Це вбудований функціональний інтерфейс, який ідеально підходить для валідації об'єктів, які потенційно можуть бути null. У разі NullPointerException наш Optional.ofNullable (Object) стрибне прямо в orElse блок, який надасть нам якесь дефолтний значення. Крім цього, даний вбудований функціональний інтерфейс, як і будь-який інший, надає нам доступ до нових можливостей Java 8, однією з яких є гнучка фільтрація з використанням lambda expressions. Таким чином, за допомогою техніки methods chaining. ми перевірили об'єкт на null, відфільтрували по невід'ємним числах, і надали дефолтний значення на випадок не проходження валідації. Корисно? Поїхали далі.
В якості альтернативи циклам в Java 8 прийшли streams. які дозволяють нам писати код ще більш гнучко. До слова, розробники передбачили також і parallel streams (думаю назва говорить сама за себе).
Як приклад приведу реалізацію отримання списку текстових Айтем з колекції веб-елементів.
Нічого надприродного: звичайний циклічний обхід елементів з пересохраненіем який позбувся прогалин тексту в новий список. Тепер давайте подивимося, як будуть виглядати streams:
Як бачите, ніяких проміжних колекцій більше не потрібно. Звернення до stream () має на увазі той самий циклічний обхід. map (lamda expression) дозволяє перетворити кожен елемент об'єкта колекції в нову сутність. А collect з шикарним utility класом Collectors поверне нову колекцію замапленних раніше об'єктів. До слова, на виході ми можемо отримати що завгодно, навіть Map. Зручно? Поїхали далі.
Останній, більш складний приклад, зав'язаний на все тих же streams. У недавній темі я наводив приклад реалізації кастомних темплейтов за допомогою Mustache. Власне, інформація для заповнення бралася з нутрощів TestNG results структури, яка, до слова, є не дуже то і тривіальною.
Для формування потрібного репорт Скоуп ми проходили по сьют, попутно вигріб результати, які також бажано було ще і впорядкувати за допомогою кастомних Comparators. Все це справа потім зберігалося в Suite / TestResult суті для подальшої обробки. Виглядало це приблизно так:
scope.png 1074x682 45.6 KB
І це тільки мала частина того, що зазвичай потрібно вигрібати для формування репорт. Тепер давайте подивимося на Java 8 модифікацію:
new% 2Bscope.png 1160x487 41.1 KB
Як ви вже зрозуміли, від проміжних колекцій ми позбулися (stream). Стейтменти (if) були замінені фільтрами (filter). Підсумкові суті готувалися колекторами (Collectors.toList ()), з попереднім перетворенням об'єктів (map (labmda)). Апофеозом тут постали кастомниє Comparators, реалізовані прямо на льоту за допомогою sorted + lambda. І це тільки частина можливостей streams.