Возьмите вас за руку, чтобы испытать Stream

Java Java EE

предисловие

Только лысая голова может стать сильнее.

Текст был включен в мой репозиторий 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 разделено на три этапа:

  1. Создать поток
  2. Выполнение промежуточных операций через объекты потока Stream
  3. Выполните заключительную операцию и получите результат

三步走

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接口的方法

Наконец

Эта статья в основном дает вам предварительное представление о потоке Stream.Что касается объяснения API промежуточной операции и конечной операции, я не буду ее писать (есть также много онлайн-уроков)

Я думаю, что есть две причины использовать Stream:

  1. Библиотека JDK предоставляет существующие API, а код написан лаконично и оптимизирован.
  2. Удобный параллелизм. Мы можем вспомнить один вывод: вмногоядерныйслучае, вы можете использоватьпараллельноStream API, чтобы воспользоваться преимуществами многоядерности. В случае с одним ядром пишем своиforПроизводительность не намного хуже, чем у Stream API

Использованная литература:

рад вывестигалантерейные товарыОбщедоступный номер технологии Java:Java3y. В публичном аккаунтеБолее 200 оригинальных статейТехнические статьи, обширные видеоресурсы, красивые карты мозга,Следуйте, чтобы получить его!

转发到朋友圈是对我最大的支持!

Я думаю, что моя статья хорошо написана, нажмитеотличный!