Приклади розв’язування задач на потоки даних Stream API
Зміст
- 1. Визначення кількості парних чисел в потоці даних. Приклад
- 2. Робота з потоками рядків. Пошук в рядку. Приклад
- 3. Сортування рядків. Приклад
- Зв’язані теми
Пошук на інших ресурсах:
1. Визначення кількості парних чисел в потоці даних. Приклад
Умова задачі. Для будь-якого набору випадково-згенерованих цілих чисел потрібно визначити кількість парних. Для розв’язку задачі використати засоби програмного інтерфейсу Stream API.
Розв’язок. Розв’язок задачі відображений у статичному методі DemoStream(), який викликається з функції main().
// Приклади відкриття/закриття потоку даних import java.util.stream.*; import java.util.*; import java.util.function.*; public class TrainStreamAPI { public static void DemoStream() { // Задача. Для будь-якого набору випадково згенерованих // чисел потрібно визначити кількість парних. // 1. Створити потік даних з випадкового масиву чисел ArrayList<Integer> AL = new ArrayList<Integer>(); int number; Random rnd = new Random(); for (int i=0; i<10; i++) { number = rnd.nextInt() % 100; AL.add(number); } System.out.println("Array AL:"); System.out.println(AL); // 2. Визначити кількість парних чисел. Спосіб 1. // 2.1. Створити потік з масиву AL - метод stream() Stream<Integer> st = AL.stream(); // 2.2. Оголосити посилання на стандартний // функціональний інтерфейс Predicate<Integer> Predicate<Integer> fn; // це посилання буде передано у метод filter() // 2.3. Присвоїти посиланню лямбда-вираз, який визначає, чи парне число fn = (n) -> (n%2) == 0; // 2.4. Викликати метод filter, який вибере тільки парні числа з потоку st Stream<Integer> resStream = st.filter(fn); // 2.5. Вивести кількість парних чисел System.out.println("n = " + resStream.count()); // 3. Визначити кількість парних чисел. Спосіб 2 - швидкий спосіб int n2 = (int)(AL.stream().filter((n)->(n%2)==0)).count(); System.out.println("n2 = " + n2); } public static void main(String[] args) { DemoStream(); } }
Результат виконання програми
Array AL: [-79, 99, -83, -75, -78, -22, -57, 84, 11, 15] n = 3 n2 = 3
⇑
2. Робота з потоками рядків. Пошук в рядку. Приклад
Умова задачі. Задано набір прізвищ співробітників. Розробити програму, що показує всі прізвища, які починаються на букву ‘J’. Задачу розв’язати з використанням програмного інтерфейсу Stream API.
Розв’язок.
// Приклади відкриття/закриття потоку даних import java.util.stream.*; import java.util.*; import java.util.function.*; public class TrainStreamAPI { public static void DemoStream() { // Задача. Задано набір прізвищ співробітників. // Розробити програму, яка показує всі прізвища що починаються на букву 'J' // 1. Організувати ввід прізвищ з клавіатури. // Кінець вводу - пустий рядок "" Scanner scanner = new Scanner(System.in); String s; ArrayList<String> AL = new ArrayList<String>(); System.out.println("Enter names: "); while (true) { System.out.print("name = "); s = scanner.nextLine(); if (s.equals("")==true) break; AL.add(s); } System.out.println(); // 2. Вивести масив введених прізвищ System.out.println("AL = " + AL); // 3. Обчислити кількість прізвищ, що починаються на 'J' // 3.1. Оголосити посилання на функціональний інтерфейс Predicate<T> Predicate<String> fn; // 3.2. Встановити лямбда-вираз для fn fn = (str) -> { if (str.charAt(0)=='J') return true; return false; }; // 3.3. Конвертувати AL в потік рядків Stream<String> stream = AL.stream(); // 3.4. Отримати відфільтрований потік згідно предикату, // визначеному в fn() Stream<String> resStream = stream.filter(fn); // 3.5. Вивести кількість прізвищ, що починаються на J System.out.println("count = " + resStream.count()); } public static void main(String[] args) { DemoStream(); } }
Результат виконання програми
Enter names: name = abc name = Jlskjf name = JJ name = lskdjlsk name = sldkfjs name = dflskdj name = sdsd name = ss name = AL = [abc, Jlskjf , JJ, lskdjlsk, sldkfjs, dflskdj, sdsd, ss] count = 2
⇑
3. Сортування рядків. Приклад
Умова задачі. Задано масив рядків. Використовуючи засоби Stream API посортувати рядки в лексикографічному порядку.
Розв’язок. Текст програми, що розв’язує дану задачу наступний.
import java.util.*; import java.util.stream.*; import java.util.function.*; public class StreamAPI { public static void main(String[] args) { // 1. Оголосити деякий масив рядків String[] AS = { "abcd", "bcfk", "def", "jklmn", "jprst", "afc", "ambn", "kmk", "rbd", "jus" }; // 2. Створити колекцію з масиву рядків ArrayList<String> AL = new ArrayList<String>(AS.length); for (int i=0; i<AS.length; i++) AL.add(i, AS[i]); // 3. Створити потік даних з колекції AL Stream<String> stream = AL.stream(); // 4. Посортувати потік у природному порядку Stream<String> streamSorted = stream.sorted(); // 5. Відобразити потік streamSorted // 5.1. Визначити дію, яка буде виводити один елемент потоку. // Для цього використовується інтерфейс Consumer<T> Consumer<String> action = (str) -> { System.out.println(str); }; // 5.2. Відобразити кожен елемент потоку streamSorted.forEach(action); // 6. Посортувати елементи потоку в спадному порядку // 6.1. Реалізувати компаратор - метод, що порівнює два рядки Comparator<String> comparator; comparator = (str1, str2) -> { return str2.compareTo(str1); // <0, ==0, >0 }; // 6.2. Створити новий потік stream = AL.stream(); // 6.3. Посортувати потік stream Stream<String> streamSortedDesc = stream.sorted(comparator); // 6.4. Відобразити новий потік System.out.println("-----------------------"); streamSortedDesc.forEach(action); } }
Результат виконання програми
abcd afc ambn bcfk def jklmn jprst jus kmk rbd ----------------------- rbd kmk jus jprst jklmn def bcfk ambn afc abcd
⇑
Зв’язані теми
- Приклади розв’язку задач на потоки об’єктів розроблених класів
- Потоки даних. Stream API. Загальна інформація
⇑