Java. Интерфейс BaseStream. Примеры использования методов интерфейса




Интерфейс BaseStream. Примеры использования методов интерфейса

Перед изучением данной темы рекомендуется ознакомиться со следующей темой:


Содержание


Поиск на других ресурсах:

1. Перечень методов интерфейса BaseStream

Ниже приведен перечень основных методов интерфейса BaseStream и их назначение:

  • close() – закрыть поток данных;
  • isParallel() – определить, есть ли поток параллельным;
  • iterator() – получить итератор для потока;
  • onClose() — задать обработчик события закрытия потока;
  • parallel() — вернуть параллельный поток данных;
  • sequential() — вернуть последовательный поток данных;
  • spliterator() — получить итератор-разделитель;
  • unordered() — вернуть неупорядоченный поток данных.

 

2. Метод close(). Закрытие потока данных. Пример

Чтобы закрыть поток данных используется метод close(), который имеет следующую общую форму

void close();

Обязательно нужно закрывать только те потоки данных, которые связаны с файлами. Другие потоки данных закрывать необязательно.

В примере демонстрируется закрытие потока данных System.in, который следует из клавиатурного ввода. Для ввода данных используется класс Scanner. Сначала формируется массив целых чисел, затем этот массив выводится на экран. В конце программы поток данных закрывается методом close().

// Примеры открытия/закрытия потока данных
import java.util.stream.*;
import java.util.*;

public class TrainStreamAPI {

  public static void main(String[] args) {
    // Метод close()
    // Получить поток данных из клавиатуры
    Scanner scanner = new Scanner(System.in);

    // Прочитать массив чисел. Конец ввода - число 0
    Integer num;
    ArrayList<Integer> AL = new ArrayList();

    while (true) {
      System.out.print("num = ");

      // Получить число из клавиатури
      num = scanner.nextInt();

      // Проверить, не введен ли 0
      if (num==0) break;

      // Добавить число к массиву
      AL.add(num);
    }

    // Вывести массив на экран
    System.out.println("End of input.");
    System.out.println("AL = " + AL);

    // Закрыть поток scanner
    scanner.close();
  }
}

Результат выполнения программы

num = 15
num = 18
num = -9
num = 3
num = 0
End of input.
AL = [15, 18, -9, 3]

 

3. Метод isParallel(). Определение, есть ли поток данных параллельным. Пример

Метод isParallel() предназначен для определения того, есть ли параллельным вызывающий поток данных. Метод имеет следующую общую форму:

boolean isParallel()

Метод возвращает true, если поток данных параллельный. Если поток данных последовательный, то метод возвращает false.

Текст программы, демонстрирующий использование метода isParallel(), следующий.

import java.util.ArrayList;
import java.util.stream.*;

public class StreamAPI {

  public static void main(String[] args) {
    // Метод isParallel() - определить, есть ли поток данных параллельным

    // 1. Создать массив чисел, который будет потоком данных
    ArrayList<Integer> AL = new ArrayList<Integer>();
    for (int i=0; i<10; i++) {
      AL.add((int)(Math.random()*100)); // числа от 0 до 99
    }

    // 2. Вывести массив для контроля
    System.out.println(AL);

    // 3. Получить последовательный поток данных из массива AL
    Stream<Integer> stream = AL.stream();

    // 4. Определить, есть ли поток stream параллельным
    if (stream.isParallel())
      System.out.println("stream is parallel");
    else 
      System.out.println("stream is not parallel");

    // 5. Получить параллельный поток данных из массива AL
    Stream<Integer> parallelStream = AL.parallelStream();

    // 6. Определить, есть ли поток parallelStream параллельным
    if (parallelStream.isParallel())
      System.out.println("parallelStream is parallel");
    else
      System.out.println("parallelStream is not parallel");
  }
}

Результат выполнения программы

[48, 64, 30, 40, 19, 17, 27, 75, 48, 52]
stream is not parallel
parallelStream is parallel

 

4. Метод iterator(). Получить итератор для потока данных. Пример

Метод iterator() предназначен для получения итератора. С помощью итератора можно просматривать элементы потока и обрабатывать их. Общая форма метода следующая

Iterator<T> iterator()

здесь

  • Iterator<T> – тип, характеризующий итератор, который обрабатывает элементы некоторого обобщенного типа T.

Метод есть конечной операцией.

Текст программы, демонстрирующей метод iterator(), следующий.

import java.util.*;
import java.util.stream.*;
import java.util.function.*;

public class StreamAPI {

  public static void main(String[] args) {

    // 1. Создать набор чисел
    ArrayList<Double> AL = new ArrayList<Double>();
    AL.add(1.5);
    AL.add(2.8);
    AL.add(-2.3);
    AL.add(3.4);
    AL.add(1.1);

    // 2. Создать поток данных из набора чисел AL
    Stream<Double> stream = AL.stream();

    // 3. Получить итератор для потока stream
    Iterator<Double> it = stream.iterator();

    // 4. Вывести элементы потока с помощью итератора
    System.out.print("stream = ");
    while (it.hasNext()) {
      System.out.print(it.next()+" ");
    }
    System.out.println();

    // 5. Удалить отрицательные элементы потока, создать результирующий массив
    ArrayList<Double> AL2 = new ArrayList<Double>();
    double t;

    // Сформировать новый поток и получить итератор на него
    stream = AL.stream();
    it = stream.iterator();

    // Цикл обхода потока stream
    while (it.hasNext()) {
      // Получить число из потока
      t = it.next();

      // Если число положительное, то прибавить его к массиву AL2
      if (t>=0.0)
        AL2.add(t);
    }

    // 6. Вывести массив AL2
    System.out.println("AL2 = " + AL2);
  }
}

Результат выполнения программы

stream = 1.5 2.8 -2.3 3.4 1.1
AL2 = [1.5, 2.8, 3.4, 1.1]

 

5. Метод onClose(). Получить поток с заданным обработчиком события закрытия. Пример

Метод onClose() позволяет установить обработчик события закрытия потока — специальный метод, который будет вызываться при закрытии потока и выполнять некоторые завершающие действия. Метод onClose() имеет следующую общую форму

S onClose(Runnable closeHandler)

здесь

  • closeHandler – класс, содержащий метод run() интерфейса Runnable. В методе run() вписывается код, который нужно выполнить при закрытии вызывающего потока;
  • S — поток с установленным обработчиком closeHandler;

После того, как обработчик closeHandler установлен, он вызывается в случае, когда вызывающий поток выполнит метод close().

Пример. В примере объявляется класс MyCloseStream, который выступает обработчиком, вызываемым при закрытии потока.

Класс MyCloseStream реализует интерфейс Runnable. Это значит, что в классе обязательно нужно реализовать единственный метод run() интерфейса Runnable. В методе run() вписывается код, который должен выполняться при закрытии потока. В программе, в демонстрационных целях, в методе run() выводится простое информационное сообщение.

Текст демонстрационной программы следующий.

import java.util.*;
import java.util.stream.*;

// Класс-обработчик события закрытия потока
class MyCloseStream implements Runnable {

  // Метод, закрывающий поток
  public void run() {
    // Здесь вписывается код, который вызывается при закрытии потока

    // Вывести некоторое информационное сообщение
    System.out.println("Close the stream.");

    // ...
  }
}

public class StreamAPI {

  public static void main(String[] args) {
    // Демонстрация вызова метода run() класса MyCloseStream
    // 1. Создать набор чисел
    ArrayList<Integer> AL = new ArrayList<Integer>();
    AL.add(25);
    AL.add(31);
    AL.add(22);
    AL.add(18);
    AL.add(11);

    // 2. Создать поток данных
    Stream<Integer> stream = AL.stream();

    // 3. Указать обработчик закрытия потока
    MyCloseStream handler = new MyCloseStream();

    // 4. Вызвать метод onClose() потока stream и
    // передать ему обработчик - экземпляр handler.
    stream.onClose(handler);

    // 5. Закрыть поток:
    // вызывается обработчик закрытия потока
    stream.close(); // Close the stream
  }
}

Результат выполнения программы

Close the stream.

 

6. Метод parallel(). Вернуть параллельный поток данных. Пример

Метод parallel() позволяет получить параллельный поток из вызывающего потока.

Если вызывающий поток уже является параллельным, то возвращается этот поток. Метод parallel() является промежуточной операцией и имеет следующую общую форму:

S parallel()

здесь

  • S – результирующий параллельный поток.

Текст программы, демонстрирующей метод parallel() следующий:

import java.util.*;
import java.util.stream.*;

public class StreamAPI {

  public static void main(String[] args) {
    // 1. Создать набор чисел
    ArrayList<Integer> AL = new ArrayList<Integer>();
    AL.add(20);
    AL.add(32);
    AL.add(12);
    AL.add(23);
    AL.add(51);

    // 2. Создать последовательный поток данных
    Stream<Integer> stream = AL.stream();

    // 3. Проверить, есть ли поток параллельным
    if (stream.isParallel())
      System.out.println("stream is parallel");
    else
      System.out.println("stream is sequential");

    // 4. Вызвать метод parallel() - сформировать параллельный поток
    Stream<Integer> stream2 = stream.parallel();

    // 5. Вывести данные о потоке
    if (stream2.isParallel())
      System.out.println("stream2 is parallel");
    else
      System.out.println("stream2 is sequential");
  }
}

Результат выполнения программы

stream is sequential
stream2 is parallel

 

7. Метод sequential(). Вернуть последовательный поток данных. Пример

Метод sequential() позволяет получить последовательный поток из вызывающего потока. Если вызывающий поток является последовательным, то возвращается этот же поток. Метод является промежуточной операцией. Метод имеет следующую общую форму:

S sequential()

здесь

  • S – результирующий последовательный поток.

Текст программы, демонстрирующей метод sequential(), приведен ниже.

import java.util.*;
import java.util.stream.*;

public class StreamAPI {

  public static void main(String[] args) {
    // 1. Создать набор чисел
    ArrayList<Integer> AL = new ArrayList<Integer>();
    AL.add(20);
    AL.add(32);
    AL.add(12);
    AL.add(23);
    AL.add(51);

    // 2. Создать последовательный поток данных
    Stream<Integer> stream = AL.stream();

    // 3. Проверить, что поток последовательный
    if (stream.isParallel())
      System.out.println("stream is parallel");
    else
      System.out.println("stream is sequential");

    // 4. Вызвать метод sequential() - сформировать последовательный поток
    Stream<Integer> stream2 = stream.sequential();

    // 5. Вывести данные о потоке stream2
    if (stream2.isParallel())
      System.out.println("stream2 is parallel");
    else
      System.out.println("stream2 is sequential");
  }
}

Результат выполнения программы

stream is sequential
stream2 is sequential

 

8. Метод unordered(). Вернуть неупорядоченный поток данных. Пример

Метод unordered() возвращает неупорядоченный поток данных на основе вызывающего потока. Если вызывающий поток данных является неупорядоченным, то именно он и возвращается.

Общая форма метода следующая:

S unordered()

здесь

  • S – результирующий неупорядоченный поток.

Метод есть промежуточной операцией.

Текст программы, демонстрирующей метод unordered() следующий.

import java.util.*;
import java.util.stream.*;
import java.util.function.*;

public class StreamAPI {

  public static void main(String[] args) {
    // 1. Создать набор чисел
    ArrayList<Double> AL = new ArrayList<Double>();
    AL.add(1.5);
    AL.add(2.8);
    AL.add(-2.3);
    AL.add(3.4);
    AL.add(1.1);

    // 2. Создать поток данных из набора чисел AL
    Stream<Double> stream = AL.stream();

    // 3. Отсортировать поток
    stream = stream.sorted();

    // 4. Вывести поток stream
    // 4.1. Объявить действие, выводящее элемент типа Double
    Consumer<Double> action = (n) -> {
      System.out.print(n + " ");
    };

    // 4.2. Вызвать метод forEach()
    System.out.print("Sorted Array AL = [");
    stream.forEach(action);
    System.out.println("]");

    // 5. Создать новый неупорядоченный поток - метод unordered()
    stream = AL.stream().unordered();

    // 6. Вывести неупорядоченный поток
    System.out.print("Unordered Array AL = [");
    stream.forEach(action);
    System.out.println("]");
  }
}

 


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