Java. Приклади розв’язування задач на потоки даних Stream API

Приклади розв’язування задач на потоки даних Stream API


Зміст


Пошук на інших ресурсах:




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

  


Зв’язані теми