10 способов создать поток на Java
Stream API, представленный в Java 8, используется для обработки коллекций объектов. Поток - это последовательность объектов, которая поддерживает множество различных методов, которые можно объединить в конвейер для получения желаемого результата.
Особенности потока Java:
- Поток не является структурой данных, он принимает входные данные из коллекций, массивов или каналов ввода-вывода.
- Streams не изменяет исходную структуру данных, они только предоставляют результат в виде конвейерных методов.
- Каждая промежуточная операция выполняется лениво и в результате возвращает поток, поэтому различные промежуточные операции могут быть распределены по конвейеру. Терминальная операция отмечает конец потока и возвращает результат.
Другой способ создания потоков:
- Использование коллекции
Подход:
- Получить коллекцию
- Создайте последовательный поток из коллекции с помощью метода Collection.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(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);
}
}
Выход:Вундеркинды для гиков
- Создать поток из указанных значений
Метод 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
- Создать поток из массива:
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
- Создать поток с помощью Arrays.stream ()
- Создайте пустой поток с помощью 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();
}
}
Выход: - Создайте поток с помощью 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
- Создайте бесконечный поток с помощью 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
- Создайте бесконечный поток с помощью метода 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
- Создать поток из шаблона с помощью предиката
В 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
- Создать поток из Итератора
Итераторы в 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
- Создать поток из 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 и многому другому, см. Полный курс подготовки к собеседованию .