предисловие
Только лысая голова может стать сильнее.
Текст был включен в мой репозиторий GitHub, добро пожаловать, звезда:GitHub.com/Zhongf UC очень…
В прошлой статье объяснялось использование лямбда-выражений»Недавно изученные основы лямбда-выражений", ученики, которые не читали, могут сначала прочитать~
Я полагаю, что есть много студентов, которые хотят знать: в каком сценарии лямбда-выражения используются чаще? Для стороны с лямбдой используйтеСтрим потокбудет больше
Когда большинство людей впервые прочитают код Stream stream, они будут немного непонятны (его код выглядит так, как будто он написан не на Java), я надеюсь, что эта статья поможет вам начать работу.
1. Поток опыта
Когда все занимаются самообучением, большинство из них выучат программу:算出从数组元素的和
, как мы это написали? Обычно это происходит так:
public static void main(String[] args) {
int[] nums = { 1, 2, 3 };
int sum = 0;
for (int i : nums) {
sum += i;
}
System.out.println("结果为:" + sum);
}
Если мы используем Stream stream, это может быть так:
public static void main(String[] args) {
int[] nums = { 1, 2, 3 };
int sum2 = IntStream.of(nums).sum();
System.out.println("结果为:" + sum2);
}
отколичество кодаИз вышеизложенного ясно видно, что способов использования Stream станет меньше.
Потоковое программирование, как я понимаю, это:В некоторых сценариях часто используются операции (суммирование/удаление дубликатов/фильтрация... и т. д.), API упакован для вас, не пишите его самостоятельно, просто вызовите API, который я вам предоставлю.
1.1 Поддержка параллелизма
Вернемся к нашему исходному коду:
public static void main(String[] args) {
int[] nums = { 1, 2, 3 };
int sum = 0;
for (int i : nums) {
sum += i;
}
System.out.println("结果为:" + sum);
}
если мы хотимfor
Если внутренняя часть цикла поддерживает параллелизм, очевидно, что написать ее будет непросто. Но способ использования Stream stream,Вызов метода может поддерживать параллелизм(параллельно):
public static void main(String[] args) {
int[] nums = { 1, 2, 3 };
int sum2 = IntStream.of(nums).parallel().sum();
System.out.println("结果为:" + sum2);
}
Достоинства: Настройка API однозначно меньше, чем количество написанного вами кода.
Недостаток: не легко отлаживать
На мой взгляд, зачем использовать Stream, есть две вышеуказанные причины:
- Удобно для параллелизма
- Небольшой объем кода (прямой вызов API)
2. Как использовать Стрим?
Использование Stream разделено на три этапа:
- Создать поток
- Выполнение промежуточных операций через объекты потока Stream
- Выполните заключительную операцию и получите результат
2.1 Создать поток
Наиболее часто используемый способ создания потоков —из коллекцииСоздать отток
/**
* 返回的都是流对象
* @param args
*/
public static void main(String[] args) {
List<String> list = new ArrayList<>();
// 从集合创建
Stream<String> stream = list.stream();
Stream<String> stream1 = list.parallelStream();
// 从数组创建
IntStream stream2 = Arrays.stream(new int[]{2, 3, 5});
// 创建数字流
IntStream intStream = IntStream.of(1, 2, 3);
// 使用random创建
IntStream limit = new Random().ints().limit(10);
}
2.2 Выполнение промежуточных операций
Как понять промежуточную операцию? Это означает следующее: Мы смогли создать Поток выше, мы правыStreamПосле выполнения операции возвращаемый поток все еще является потоком, тогда мы называем эту операцию промежуточной операцией.
Например, теперь у нас есть строкаmy name is 007
, код показан ниже:
String str = "my name is 007";
Stream.of(str.split(" ")).filter(s -> s.length() > 2)
.map(s -> s.length()).forEach(System.out::println);
авария:
1. Создайте объект потока из массива строк:
Stream<String> split = Stream.of(str.split(" "));
2. Выполнить промежуточную операцию (фильтр) через API объекта потока и вернуть объект потока:
Stream<String> filterStream = split.filter(s -> s.length() > 2);
3. Выполнить промежуточную операцию (карту) через возвращаемый объект потока и вернуть объект потока:
Stream<Integer> integerStream = filterStream.map(s -> s.length());
Поскольку промежуточная операция возвращаетобъект потока, так что мы можемцепной вызов.
Примечание. Операции над потоками выполняются не сразу, а только тогда, когда пользователю действительно нужен результат (ленивая оценка).
Например,peek()
Это промежуточная операция, которая возвращает объект потока Stream. Пока она не выполняет заключительную операцию, поток не будет выполнен.
String str = "my name is 007";
Stream.of(str.split(" ")).peek(System.out::println); // 不会有信息打印
2.3 Выполнение заключительных операций
Последняя операция больше не возвращает объект Stream,Поток будет выполняться только тогда, когда вызывается метод последней операции.. Или возьмем приведенный выше пример в качестве примера:
String str = "my name is 007";
Stream.of(str.split(" ")).peek(System.out::println).forEach(System.out::println)
На этот раз мы добавили конечную операцию, поэтому на этот раз будет выполняться поток Stream.Поскольку промежуточная операция и конечная операция печатаются, вы увидите две печати:
Что касается того, как различать промежуточные операции и конечные операции, мы используемвозвращаемое значениеПросто приходите и смотрите. Промежуточная операция возвращает объект экземпляра Stream, а конечная операция возвращает не объект экземпляра Stream:
Наконец
Эта статья в основном дает вам предварительное представление о потоке Stream.Что касается объяснения API промежуточной операции и конечной операции, я не буду ее писать (есть также много онлайн-уроков)
Я думаю, что есть две причины использовать Stream:
- Библиотека JDK предоставляет существующие API, а код написан лаконично и оптимизирован.
- Удобный параллелизм. Мы можем вспомнить один вывод: вмногоядерныйслучае, вы можете использоватьпараллельноStream API, чтобы воспользоваться преимуществами многоядерности. В случае с одним ядром пишем свои
for
Производительность не намного хуже, чем у Stream API
Использованная литература:
- Потоковые операции в Java 8 — базовое использование и тестирование производительности
- Код Java 8 Stream, вы его понимаете?
рад вывестигалантерейные товарыОбщедоступный номер технологии Java:Java3y. В публичном аккаунтеБолее 200 оригинальных статейТехнические статьи, обширные видеоресурсы, красивые карты мозга,Следуйте, чтобы получить его!
Я думаю, что моя статья хорошо написана, нажмитеотличный!