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. Сортировка строк. Пример

Условие задачи. Задан массив строк. Используя средства 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

 


Связанные темы