Главная страница
Навигация по странице:

  • Из каких частей состоит использование стримов

  • Первый этап работы со стримом Какой второй этап работы со стримом

  • В каком случае нужно закрывать стрим

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

  • Для чего нужен метод collect() в стримах

  • Ревью 7. Ревью 7 - Функциональные Интерфейсы, Streams. Чем является Stream в контексте Java 3 Для чего нужен 3


    Скачать 84.11 Kb.
    НазваниеЧем является Stream в контексте Java 3 Для чего нужен 3
    АнкорРевью 7
    Дата19.01.2023
    Размер84.11 Kb.
    Формат файлаdocx
    Имя файлаРевью 7 - Функциональные Интерфейсы, Streams.docx
    ТипДокументы
    #894719
    страница3 из 9
    1   2   3   4   5   6   7   8   9

    В чем разница между коллекцией (Collection) и стримом (Stream)?


    Разница между коллекцией (Collection) данных и потоком (Stream) из новой JDK8 в том, что коллекции позволяют работать с элементами по-отдельности, тогда как поток (Stream) не позволяет. Например, с использованием коллекций, вы можете добавлять элементы, удалять, и вставлять в середину.

    Также стоит отметить важность самой концепции сущностей: Collection - это прежде всего воплощение Структуры Данных. Например, Set не просто хранит в себе элементы, он реализует идею множества с уникальными элементами, тогда как Stream, это прежде всего абстракция необходимая для реализации конвейера вычислений, собственно, поэтому, результатом работы конвейера являются те или иные Структуры Данных или же результаты проверок/поиска и т.п.

    Из каких частей состоит использование стримов?


    - создание стрима;

    - промежуточные операции (или их отсутствие);

    - терминальная операция (запускает весь процесс вычисления);

    Первый этап работы со стримом? Какой второй этап работы со стримом?


    Первый - создание стрима, второй - промежуточные операции.

    Какие существуют способы создания стрима?


    1. Классический: Создание стрима из коллекции collection.stream()

    Collection collection = Arrays.asList("a1", "a2", "a3");

    Stream streamFromCollection = collection.stream();

    2. Создание стрима из значений Stream.of(значение1,… значениеN)

    Stream streamFromValues = Stream.of("a1", "a2", "a3");

    3. Создание стрима из массива Arrays.stream(массив)

    String[] array = {"a1","a2","a3"};

    Stream streamFromArrays = Arrays.stream(array);

    4. Создание стрима из файла (каждая строка в файле будет отдельным элементом в стриме) Files.lines(путь_к_файлу)

    Stream streamFromFiles = Files.lines(Paths.get("file.txt"))

    5. Создание стрима из строки «строка».chars()

    IntStream streamFromString = "123".chars()

    6. С помощью Stream.builder Stream.builder().add(...)....build()

    Stream.builder().add("a1").add("a2").add("a3").build()

    7. Создание параллельного стрима collection.parallelStream()

    Stream stream = collection.parallelStream();

    8. Создание бесконечных стрима с помощью Stream.iterate

    Stream.iterate(начальное_условие, выражение_генерации)

    Stream streamFromIterate = Stream.iterate(1, n -> n + 1)

    9. Создание бесконечных стрима с помощью Stream.generate Stream.generate(выражение_генерации)

    Stream streamFromGenerate = Stream.generate(() -> "a1")

    В каком случае нужно закрывать стрим?


    Только потоки, источником которых является канал ввода-вывода, например Files.lines(Path, Charset) должны быть закрыты. Остальные реализуют AutoClosable.

    Можно ли конкатенировать стримы? если да, то каким методом?


    Объединение с помощью метода .concat(stream1, stream2);

    Можно ли получить пустой стрим?


    Пустой стримStream.empty()

    Как получить стрим из массива?


    Arrays.stream(массив)

    Для чего нужен метод collect() в стримах?


    Метод collect() является конечной операцией, которая используется для представление результата в виде коллекции или какой-либо другой структуры данных.

    collect() принимает на вход Collector<Тип_источника, Тип_аккумулятора, Тип_результата>, который содержит четыре этапа: supplier - инициализация аккумулятора, accumulator - обработка каждого элемента, combiner - соединение двух аккумуляторов при параллельном выполнении, [finisher] - необязательный метод последней обработки аккумулятора. В Java 8 в классе Collectors реализовано несколько распространённых коллекторов:

    toList(), toCollection(), toSet() - представляют стрим в виде списка, коллекции или множества;

    toConcurrentMap(), toMap() - позволяют преобразовать стрим в Map;

    averagingInt(), averagingDouble(), averagingLong() - возвращают среднее значение;

    summingInt(), summingDouble(), summingLong() - возвращает сумму;

    summarizingInt(), summarizingDouble(), summarizingLong() - возвращают SummaryStatistics с разными агрегатными значениями;

    partitioningBy() - разделяет коллекцию на две части по соответствию условию и возвращает их как Map;

    groupingBy() - разделяет коллекцию на несколько частей и возвращает Map>;

    mapping() - дополнительные преобразования значений для сложных Collector-ов.

    Так же существует возможность создания собственного коллектора через Collector.of():

    Collector, List> toList = Collector.of(

    ArrayList::new,

    List::add,

    (l1, l2) -> { l1.addAll(l2); return l1; }

    );
    1   2   3   4   5   6   7   8   9


    написать администратору сайта