4.3 KiB
4.3 KiB
title | localeTitle |
---|---|
Streams | Streams |
Streams
В Java 8 Streams добавлена новая функция Java toolbox. Потоки позволяют быстро и чисто обрабатывать коллекции.
Перед продолжением прочитайте главу о лямбдах и функциональном программировании.
Как это устроено
Поток обходит элементы коллекции для вас. Каждое промежуточное и терминальное действие вызывается для каждого объекта. После завершения всех операций для первых объектов, загружается второй объект.
Важные методы
Создание
Collection.stream()
: создать поток из любого объекта из любого класса, реализующегоCollection
Arrays.stream(array)
: создать поток из массива
Промежуточные операции
Эти операции каким-то образом преобразуют объекты Stream.
Stream.map(Function<In,Out> function)
: примените функцию для преобразования In to OutStream.filter(Predicate<In> predicate)
: удалить объекты из потока, для которых предикат не проверяет trueStream.distinct()
: удалить объекты из потока, которые являются дубликатамиStream.sorted()
: сортировка объектов в потокеStream.limit(int n)
: конец потока после n объектов
Терминальные операции
Эти операции принимают объекты Stream и завершают поток.
Stream.collect(Collector<In,?,Out> collector)
: собирать все объекты в потоке в объектStream.forEach(Consumer<In> consumer)
: потребляет все объекты в потоке, используя функцию пользователяStream.count()
: считать все объекты в потокеStream.findFirst()
: возвращает первый объект Stream и останавливаетсяStream.anyMatch(Predicate<In> predicate)
: возвращает true, если какой-либо объект в потоке проверяет true для предикатаStream.allMatch(Predicate<In> predicate)
: возвращает true, если весь объект в потоке test true для предиката
Примеры
// print the length of all Strings in a List
for (String string : Arrays.asList("abc", "de", "f", "abc")) {
int length = string.length();
System.out.println(length);
}
Arrays.asList("abc", "de", "f", "abc")
.stream()
.map(String::length)
.forEach(System.out::println);
// output: 3 2 1 3
// print all Strings in a List with a Length greater than 2
for (String string : Arrays.asList("abc", "de", "f", "abc")) {
if (string.length() > 2) {
System.out.println(string);
}
}
Arrays.asList("abc", "de", "f", "abc")
.stream()
.filter(string -> string.length() > 2)
.forEach(System.out::println);
// output: abc abc
// create a sorted List with all unique Strings from another List which are longer than or requal 2
List<String> result = new ArrayList<>();
for (String string : Arrays.asList("de", "abc", "f", "abc")) {
if (string.length() >= 2
&& ! result.contains(string)) {
result.add(string);
}
}
Collections.sort(result);
List<String> result2 = Arrays.asList("de", "abc", "f", "abc")
.stream()
.filter(string -> string.length() >= 2)
.distinct()
.sorted()
.collect(Collectors.toList());
// result: abc de