Примеры решения задач на потоки данных 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. Сортировка строк. Пример
Условие задачи. Задан массив строк. Используя средства StreamAPI отсортировать строки в лексикографическом порядке.
Решение. Текст програмы, решающей данную задачу, следующий.
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", "qrbd", "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. Общая информация
⇑