10 способов создать поток на Java

Опубликовано: 5 Января, 2022

Stream API, представленный в Java 8, используется для обработки коллекций объектов. Поток - это последовательность объектов, которая поддерживает множество различных методов, которые можно объединить в конвейер для получения желаемого результата.

Особенности потока Java:

  • Поток не является структурой данных, он принимает входные данные из коллекций, массивов или каналов ввода-вывода.
  • Streams не изменяет исходную структуру данных, они только предоставляют результат в виде конвейерных методов.
  • Каждая промежуточная операция выполняется лениво и в результате возвращает поток, поэтому различные промежуточные операции могут быть распределены по конвейеру. Терминальная операция отмечает конец потока и возвращает результат.

Другой способ создания потоков:

  1. Использование коллекции

    Подход:

    1. Получить коллекцию
    2. Создайте последовательный поток из коллекции с помощью метода Collection.stream ()
    3. Распечатать поток

    Ниже представлена реализация описанного выше подхода:

    Программа:

    // Java program to create Stream from Collections
    import java.util.*;
    import java.util.stream.Stream;
    class GFG {
    // Function convert a List into Stream
    private static <T> void getStream(List<T> list)
    {
    // Create stream object with the List
    Stream<T> stream = list.stream();
    // Iterate list first to last element
    Iterator<T> it = stream.iterator();
    // Iterate stream object
    while (it.hasNext()) {
    System.out.print(it.next() + " " );
    }
    }
    public static void main(String[] args)
    {
    // Create ArrayList of String
    List<String> list = new ArrayList<>();
    // Add element in list
    list.add( "Geeks" );
    list.add( "for" );
    list.add( "Geeks" );
    // Get the Stream from the List
    getStream(list);
    }
    }
    Выход:
    Вундеркинды для гиков
    
  2. Создать поток из указанных значений

    Метод Stream.of (T… t) может использоваться для создания потока с указанными значениями t, где t - элементы. Этот метод возвращает последовательный Stream, содержащий элементы t.

    Ниже представлена реализация описанного выше подхода:

    Программа:

    // Java program to create Stream from values
    import java.util.*;
    import java.util.stream.Stream;
    class GFG {
    // Function convert a List into Stream
    private static void getStream()
    {
    // Create a stream from specified values
    Stream<Integer> stream
    = Stream.of( 1 , 2 ,
    3 , 4 ,
    5 , 6 ,
    7 , 8 ,
    9 );
    // Displaying the sequential ordered stream
    stream.forEach(p -> System.out.print(p + " " ));
    }
    public static void main(String[] args)
    {
    // Get the Stream from the values
    getStream();
    }
    }
    Выход:
    1 2 3 4 5 6 7 8 9
    
  3. Создать поток из массива:

    Stream.of () и Arrays.stream () - два обычно используемых метода для создания последовательного потока из указанного массива. Оба эти метода возвращают Stream при вызове с непримитивным типом T.
    Целочисленный массив

    • Создать поток с помощью Arrays.stream ()

      Программа:



      // Java program to create Stream from Collections
      import java.util.*;
      import java.util.stream.Stream;
      class GFG {
      // Function convert a List into Stream
      private static <T> void getStream(T[] arr)
      {
      // Create stream from an array
      // using Arrays.stream()
      Stream<T> streamOfArray
      = Arrays.stream(arr);
      // Iterate list first to last element
      Iterator<T> it
      = streamOfArray.iterator();
      // Iterate stream object
      while (it.hasNext()) {
      System.out.print(it.next() + " " );
      }
      }
      public static void main(String[] args)
      {
      // Get the array
      String[] arr
      = new String[] { "a" , "b" , "c" };
      // Get the Stream from the Array
      getStream(arr);
      }
      }
      Выход:
      abc
      
    • Создать поток с помощью Stream.of ()
      Не мешающее действие, которое должно выполняться над элементами, поскольку они потребляются из потока, и также возвращает новый поток.

      Программа:

      // Java program to create Stream from Collections
      import java.util.*;
      import java.util.stream.Stream;
      class GFG {
      // Function convert a List into Stream
      private static <T> void getStream(T[] arr)
      {
      // Create stream from an array
      // using Stream.of()
      Stream<T> streamOfArray = Stream.of(arr);
      // Iterate list first to last element
      Iterator<T> it = streamOfArray.iterator();
      // Iterate stream object
      while (it.hasNext()) {
      System.out.print(it.next() + " " );
      }
      }
      public static void main(String[] args)
      {
      // Get the array
      String[] arr
      = new String[] { "a" , "b" , "c" };
      // Get the Stream from the Array
      getStream(arr);
      }
      }
      Выход:
      abc
      
  4. Создайте пустой поток с помощью Stream.empty ()

    Метод empty () используется при создании, чтобы избежать возврата null для потоков без элемента.

    Программа:

    // Java program to create empty Stream
    import java.util.*;
    import java.util.stream.Stream;
    class GFG {
    // Function convert a List into Stream
    private static void getStream()
    {
    // Create stream from an array using Stream.empty()
    Stream<String> streamOfArray
    = Stream.empty();
    // Iterate list first to last element
    Iterator<String> it
    = streamOfArray.iterator();
    // Iterate stream object
    while (it.hasNext()) {
    System.out.print(it.next() + " " );
    }
    }
    public static void main(String[] args)
    {
    // Get the empty Stream
    getStream();
    }
    }
    Выход:
    
    
  5. Создайте поток с помощью Stream.builder ()

    Метод builder () используется, когда желаемый тип должен быть дополнительно указан в правой части оператора, иначе метод build () создаст экземпляр Stream.

    Программа:

    // Java program to create Stream from Collections
    import java.util.*;
    import java.util.stream.Stream;
    class GFG {
    // Function convert a List into Stream
    private static <T> void getStream()
    {
    // Create stream using Stream builder()
    Stream.Builder<String> builder
    = Stream.builder();
    // Adding elements in the stream of Strings
    Stream<String> stream = builder.add( "a" )
    .add( "b" )
    .add( "c" )
    .build();
    // Iterate list first to last element
    Iterator<String> it = stream.iterator();
    // Iterate stream object
    while (it.hasNext()) {
    System.out.print(it.next() + " " );
    }
    }
    public static void main(String[] args)
    {
    // Get the Stream using Builder
    getStream();
    }
    }
    Выход:
    abc
    
  6. Создайте бесконечный поток с помощью Stream.iterate ()

    Метод iterate () возвращает бесконечный последовательный упорядоченный поток, созданный путем итеративного применения функции f к начальному элементу seed. В приведенном ниже примере первый элемент результирующего потока является первым параметром метода итерации. Для создания каждого следующего элемента функция применяется к предыдущему элементу. В приведенном ниже примере вторым элементом будет 4.

    Программа:

    // Java program to create infinite Stream
    // using Stream.iterate() method
    import java.util.*;
    import java.util.stream.Stream;
    class GFG {
    // Function convert a List into Stream
    private static <T> void
    getStream( int seedValue, int limitTerms)
    {
    // Create infinite stream
    // using Stream.iterate() method
    Stream.iterate(seedValue,
    (Integer n) -> n * n)
    .limit(limitTerms)
    .forEach(System.out::println);
    }
    public static void main(String[] args)
    {
    // Get the seed value
    int seedValue = 2 ;
    // Get the limit for number of terms
    int limitTerms = 5 ;
    // Get the Stream from the function
    getStream(seedValue, limitTerms);
    }
    }
    Выход:
    2
    4
    16
    256
    65536
    
  7. Создайте бесконечный поток с помощью метода Stream.generate ()

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

    Программа:

    // Java program to create infinite Stream
    // using Stream.generate() method
    import java.util.*;
    import java.util.stream.*;
    class GFG {
    // Function convert a List into Stream
    private static <T> void getStream( int limitTerms)
    {
    // Create infinite stream
    // using Stream.generate() method
    Stream.generate(Math::random)
    .limit(limitTerms)
    .forEach(System.out::println);
    }
    public static void main(String[] args)
    {
    // Get the limit for number of terms
    int limitTerms = 5 ;
    // Get the Stream from the function
    getStream(limitTerms);
    }
    }
    Выход:
    0,2293502475696314
    0,5650334795948209
    0,3418138293253522
    0,36831074763500116
    0,4864408670097241
    
  8. Создать поток из шаблона с помощью предиката

    В java 8 метод Predicate asPredicate () в Pattern создает функцию с логическим значением предиката, которая используется для сопоставления с образцом.

    Программа:

    // Java program to create Stream from Collections
    import java.util.*;
    import java.util.stream.*;
    import java.util.regex.Pattern;
    class GFG {
    // Function convert a List into Stream
    private static void
    getStream(List<String> list, Pattern p)
    {
    list.stream()
    .filter(p.asPredicate())
    .forEach(System.out::println);
    }
    public static void main(String[] args)
    {
    // Create ArrayList of String
    // that is backed by the specified array
    List<String> list
    = Arrays
    .asList( "Geeks" ,
    "For" ,
    "Geek" ,
    "GeeksForGeeks" ,
    "A Computer Portal" );
    // Get the pattern
    Pattern p = Pattern.compile( "^G" );
    // Get the Stream from the List matching Pattern
    getStream(list, p);
    }
    }
    Выход:
    Компьютерщики
    Компьютерщик
    GeeksForGeeks
    
  9. Создать поток из Итератора

    Итераторы в Java используются в Collection Framework для получения элементов один за другим. Spliterator - это ключ к созданию последовательного потока. Следовательно, в этом методе также используется Spliterator. Но в этом методе источником Spliterator является Iterable, созданный из Iterator. Итак, сначала Iterable создается из Iterator. Затем Spliterator передается методу stream () напрямую как Iterable.spliterator ().

    Программа:

    // Java program to create Stream from Collections
    import java.util.*;
    import java.util.stream.*;
    class GFG {
    // Function convert a List into Stream
    private static <T> void getStream(Iterator<T> itr)
    {
    // Convert the iterator into a Spliterator
    Spliterator<T> spitr
    = Spliterators
    .spliteratorUnknownSize(itr,
    Spliterator.NONNULL);
    // Convert spliterator into a sequential stream
    Stream<T> stream
    = StreamSupport.stream(spitr, false );
    // Iterate list first to last element
    Iterator<T> it = stream.iterator();
    // Iterate stream object
    while (it.hasNext()) {
    System.out.print(it.next() + " " );
    }
    }
    public static void main(String[] args)
    {
    // Get the Iterator
    Iterator<String> iterator = Arrays
    .asList( "a" , "b" , "c" )
    .iterator();
    // Get the Stream from the Iterator
    getStream(iterator);
    }
    }
    Выход:
    abc
    
  10. Создать поток из Iterable

    Итерируемый интерфейс разработан с учетом и не предоставляет никаких методов stream () сам по себе. Просто его можно передать в метод StreamSupport.stream () и получить Stream из заданного объекта Iterable. Легче превратить Iterable в Stream. Iterable имеет метод spliterator () по умолчанию, который можно использовать для получения экземпляра Spliterator, который, в свою очередь, можно преобразовать в Stream.

    Примечание . Iterable не является экземпляром Collection, этот метод внутренне вызывает StreamSupport.stream () для получения последовательного Stream из Spliterator, иначе он просто вызывает метод Collection.stream ().

    Программа:

    // Java program to create Stream from Collections
    import java.util.*;
    import java.util.stream.*;
    class GFG {
    // Function convert a List into Stream
    private static <T> void getStream(Iterable<T> iterable)
    {
    // Convert the iterator into a Stream
    Stream<T> stream
    = StreamSupport
    .stream(iterable.spliterator(),
    false );
    // Iterate list first to last element
    Iterator<T> it = stream.iterator();
    // Iterate stream object
    while (it.hasNext()) {
    System.out.print(it.next() + " " );
    }
    }
    public static void main(String[] args)
    {
    // Get the Iterable
    Iterable<String> iterable
    = Arrays.asList( "a" , "b" , "c" );
    // Get the Stream from the Iterable
    getStream(iterable);
    }
    }
    Выход:
    abc
    

Вниманию читателя! Не прекращайте учиться сейчас. Ознакомьтесь со всеми важными концепциями Java Foundation и коллекций с помощью курса "Основы Java и Java Collections" по доступной для студентов цене и будьте готовы к работе в отрасли. Чтобы завершить подготовку от изучения языка к DS Algo и многому другому, см. Полный курс подготовки к собеседованию .