Java8 фактических примечания чтения (главы 4-6)

Глава 4 представляет поток

Какие потоки?

Flow является новым членом API Java, что позволяет вам декларативный подход к сбору данных. Вы можете думать о них как старшие итерации по набору данных.

Преимущества:

  • Кодекс декларативный способ написать: сказать , что вы хотите достичь , а не объяснить , как реализовать операцию.
  • Некоторые операции основания может быть подключены, чтобы выразить сложный конвейер обработки данных.

Написание кода свойства:

  • декларативный
  • Может быть сложным
  • параллельный

Введение в Проточная

Поток : генерирование последовательности элементов из поддержки операций по обработке данных источника.

Из приведенного выше определения для анализа одного слова:

  • Элементы последовательности : сборник , как тот же поток также обеспечивает интерфейс, вы можете получить доступ упорядоченного набора значений для конкретного типа элемента. Говоря о потоке набор данных , рассчитанные напряжения .
  • Источник данные потока будет использоваться для обеспечения источника (то есть, источник данных), он сохранит порядок упорядоченного набора , генерируемый из потока. Поток , генерируемый список, что согласуется с порядком элементов в списке.
  • Операция обработки данных функция обработки потоков данных , аналогична работе поддержки базы данных. Операции Streaming могут быть выполнены последовательно могут быть выполнены параллельно.
    Кроме того , существуют две важные характеристики потока оперативно:
  • Конвейеризация многих операций потока сам будет возвращать поток, так что множественные операции могут быть связаны друг с другом , чтобы сформировать большую линию.
  • Внутренние итерации В отличии от итератора явного множества итераций, итерационный поток операций осуществляются сзади.

Часть операции:

  • Фильтр принимает лямбда, определенные элементы из упорядоченного потока.
  • карта принимает лямбда, преобразование элемент для извлечения информации или другой формы.
  • предел отрезан поток, так что элемент не превышает данный элемент.
  • собирать поток преобразуется в другие формы. ToList наиболее используется.

Flow и сбор

Отличия :

  • Срок выполнения представляет собой набор элементов должен работать для первой части сборника, а поток вычислений по требованию, например, создание задержки коллекции.
Только один раз проходится

Потребительский поток только один раз

Внешняя и внутренняя итерация Итерация

С помощью интерфейса Collection требует, чтобы пользователь , чтобы сделать итеративный (например, для-каждый), это известно как внешней итерации . Вместо библиотеки поток использует внутреннюю итерацию , итерация это поможет вам сделать, чтобы получить текущее значение также существует где - то, вы только что сказали , что с учетом функции , чтобы сделать это.

работа потока

Последовательность операций на две категории:

  • Промежуточная операция
  • Терминальные операции
Промежуточная операция

Промежуточное действие обратного потока на другой поток, если терминал работы линии сборки триггера или промежуточная операция не делает ничего.

Терминальные операции

Терминал будет генерировать результаты от потока углеводородов в трубопроводе, в результате, любое значение потока.

Использование потокового

В целом, используя потоки обычно включают в себя три вещи:

  • Источник данных (например, набор) для выполнения запроса;
  • Операция промежуточной цепи, образуются трубопровод;
  • Терминал операции, выполнение трубопроводов, а также для получения результатов.

Следует отметить , что выше , работа терминала, мы обычно в процессе работы сортировки множества, найдет писать код, list.sort (), и List.stream.sorted (), как показано ниже:
Пример:

    @Test
    public void test() {
        List<TestBean2> list = Arrays.asList(new TestBean2(5, "e"), new TestBean2(2, "d"), new TestBean2(2, "c"), new TestBean2(4, "b"), new TestBean2(1, "a"));
        // list排序会有种误解,list.sort()和list.stream.sorted()有什么区别,后者是用的流,如果没有终端操作(collect())这个list不会发生任何变化。
        List<TestBean2> list1 = list.stream().sorted(Comparator.comparing(TestBean2::getAge).thenComparing(TestBean2::getName)).collect(Collectors.toList());
        list1.stream().map(TestBean2::toString).forEach(System.out::println);
    }

Часть промежуточная операция:

операционная тип Возвращаемый тип Рабочие параметры Функции дескрипторов
фильтр средний Поток сказуемое T -> булево
карта средний Поток Функция <T, R> Т -> R
предел средний Поток
отсортированный средний Поток Compartor (Т, Т) -> Int
отчетливый средний Поток Поток

Часть эксплуатации терминала:

операционная тип цель
для каждого терминал Расход по каждому элементу и применять лямбда. Эта операция возвращает недействительной
подсчитывать терминал Возвращает количество элементов в потоке. Эта операция возвращает длинной
собирать терминал Уменьшение потока в коллекции, такие как список, карты и даже Integer.

Глава 5 поток

Скрининг и нарезанный

  • Скрининг с предикатом с использованием методы фильтра. Параметры для предиката Тип предикат.
  • Скрининг различных элементов с использованием различных методов. Для того, чтобы играть тяжелую роль.
  • Метод потока Предела использования усеченного, ограничивает его длину.
  • Пропустить пропуска метода с использованием элемента, пропустить первое заданное число элементов.

картографирование

Функция конвекции с каждым элементом

Потоковый метод карты поддержки, которая принимает функцию в качестве параметра. Эта функция не ограничивается элементами последовательности сбора значений свойства, также может быть реализована, чтобы преобразовать объект в другой элемент последовательности, то есть типа преобразования.

Плоский поток

flatMap способ для вас, чтобы поставить значение для каждого потока заменяется другим поток, то все потоки, связанные как поток.

Найти и матч

Несколько методов совпадают:

  • allMatch
  • AnyMatch
  • noneMatch
  • FindFirst
  • findAny

Оценка короткого замыкания : Некоторые операции не нужно обрабатывать можно получить весь поток результатов.
Несколько методов ищут:

  • findAny
  • FindFirst ,
    когда использовать FindFirst и findAny
    Если вы не можете найти результаты требований порядка, это может повысить эффективность поиска с помощью параллельных потоков методом findAny.
    Дополнительно :
    Дополнительно Класс представляет собой класс контейнера, репрезентативное значение наличия или отсутствия.

Есть четыре способа:

  • isPresent возвращает истину () будет содержать значение Факультативного времени, в противном случае ложного.
  • ifPresent (Consumer блок) будет выполняться, когда текущее значение данного кодового блока.
  • Т получить () возвращает значение, если значение существует, в противном случае возникает исключение NoSuchElement.
  • Т OrElse (Т другое) возвращает значение в значение существует, в противном случае значение по умолчанию. Подобно троичной оператор присваивания атрибута параметра.

снижение

Ключевые слова : Уменьшить
операцию уменьшения: значение в сокращении расхода.

Суммируя элемент

Пример:

    //有初始值
    int sum = numbers.stream().reduce(0,(a,b) -> a + b);
    //无初始值
    int sum = numbers.stream().reduce((a,b) -> a + b);
Максимальная Минимальная

Пример:

    // 求最大值
    Optional<Integer> max = numbers.stream().reduce(Integer::max);
    // 求最小值
    Optional<Integer> min = numbers.stream().reduce(Integer::min);
Порядок выполнения операции: без гражданства и с сохранением состояния
  • Stateless : нет внутреннего состояния, и там должно быть более глубоким пониманием состояния.
  • Есть статус : это внутреннее состояние , возможно , придется накапливать результаты, например, делает сокращение, сумма, макс и других операций на одну итерацию один раз внутри, вам необходимо сохранить результаты последней итерации вниз, зарезервирован для следующей итерации, мы должны сохранить этот внутренний для сохранения состояния, так что государство назвало эти три метода в одном результате итерации является INT или двойным, так что внутреннее состояние является ограниченным , и что она должна хранить значение, например, своего родом или наоборот различен, при сортировке или дедупликации необходима все элементы сортируются во внутреннее состояние , чтобы быть вновь вместе, это требование неограниченно , потому что я не знаю , сколько элементов в потоке.

НММ

Оригинальный тип потока Laid

Java 8 вводит исходные три типа выложенного интерфейса потока позволяет избежать затрат упаковки подразумевает:

  • IntStream
  • DoubleStream
  • LongStream

Поток отображается на значение :

  • mapToInt : тип возвращаемого значения Integer получить IntStream вместо Потоков , IntStream там подводить, макс, мин, средний метод и тому подобное.
  • mapToDouble
  • mapToLong

Конвертируется обратно в поток объектов :

  • Поток Поток = intStream.boxed ();
  • Поток Поток = doubleStream.boxed ();
  • Поток Поток = longSteam.boxed ();

Значение по умолчанию OptionalInt :

  • OptionalInt
  • OptionalDouble
  • OptionalLong
    Когда вышеупомянутый процесс осуществляется в числовом значении потока, не знаю ли задано значение в присутствии приемной емкости. Там OrElse метод (), значение по умолчанию, предусмотрен следующий пример , когда полученное значение не существует:
    // mapToInt 是转换成了对象流,并在这个对象流中取最大值(max()),如果为空则设置一个默认值为1(orElse).
    int max = menu.stream().mapToInt(Dish::getCalories).max().orElse(1);
диапазон значений

Java 8 вводит статические методы могут быть использованы для всех чисел и LongStream IntStream может генерировать диапазон:

  • Диапазон (начало, конец) не содержит значение результата (конец)
  • rangeClosed (начало, конец) значение результата содержит конечное значение (конечный)
    вышеуказанный способ может быть методом скрининга конкретного значения фильтра (ссылка даже, нечетные, и т.д.).

Пример:

    IntStream evenNumbers = IntStream.rangeClosed(1,100).filter(n -> n % 2 == 0);

Строительные Streams

Созданный поток создания ценности

Вы можете использовать Stream.of , он может принимать любое количество аргументов.

Пример:

    // 得到一个字符串流
    Stream<String> stream = Stream.of("Java 8","Lambda","In","Action");
    // 得到一个空流
    Stream<String> emptyStream = Stream.empty();
Текут создание массива

Вы можете использовать Arrays.stream ,

Пример:

    int[] numbers = {2,3,5,7,11,13};
    int sum = Arrays.stream(numbers).sum();
Порожденный поток файлов

файлы Java для обработки операций ввода / вывода NIO API (неблокирующая I / O) был обновлен для использования API Stream.
Java.nio.file.Files Многие из статического метода возвращает поток. Отличающееся тем , что метод является очень полезным: Files.lines , он возвращает строку , состоящую из каждых из линий потока в указанном файле.

Есть функция генерирует поток: Создание неограниченного потока
  • Stream.iterate итерация
  • Stream.generate поколение

Глава VI сбора потока данных

Коллектор Профиль

сокращение Коллектор для старших

Собирает вызов конвекция Метод конвекции вызывает уменьшение рабочего элемента (параметризованное коллектор). В общем, Коллектор элемент будет применять функцию преобразования.

Предопределенные коллекторы

В основном обеспечивает три функции:

  • Элемент уменьшения потока и агрегированное значение для
  • Группа элементов
  • Partition элемент

Уменьшение и резюме

Когда нужно повторно установить состав, как правило, используется коллектор объект потока, при условии, что все элементы должны течь в объединенный результат может быть использован, это результат любого типа.

Найти максимальный и минимальный расход

рекомендация

отwww.cnblogs.com/bibibao/p/11443965.html