Форум программистов, компьютерный форум, киберфорум
Java SE (J2SE)
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/9: Рейтинг темы: голосов - 9, средняя оценка - 5.00
-12 / 3 / 0
Регистрация: 02.04.2012
Сообщений: 347

Как устроен Stream, смена типов

14.08.2020, 15:53. Показов 1896. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день.

Я задался вопросом: как устроен тип Stream. Точнее, его аспект смены типа при использовании map().
Стрим выглядит как связный список (последовательных действий) и легко бы реализовался, если бы не одно но - как реализовать смену типа.

В самом интерфейсе написано вот та:
Java
1
Stream<T> extends BaseStream<T, Stream<T>>
Но я не понимаю, как это поможет создать цепочку разнотиповых стримов.

Попытки реализовать стрим (связный разнотипный список) самому не привели к успеху: я либо получаю связность, но только с одним типом. Либо я получаю необходимость объявлять что-то вроде
Java
1
StreamNode<T, StreamNode<Q, StreamNode<...>>>
То есть бесконечный список объявления переменной типа.

И что-то я тупенький, чтобы самому разрулить ситуацию. Возможно, что моя логика "стрим == связный список" в корне неверна.

В общем, прошу помочь разобраться.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
14.08.2020, 15:53
Ответы с готовыми решениями:

Преобразование Array в Map используя Stream. Приведение типов
Всем привет! Ругается на несоответствие типов Integer и String в ключе: Map&lt;Integer, String&gt; treeMap02 = Stream ...

Как создать картинки используя bitmap.Save(Stream stream, .)
Я сохраняю все картинки так: output = bmp; output.Save($&quot;Img{Convert.ToString(i)}.png&quot;); Это в конце цикла. Но как выяснилось,...

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

6
Эксперт Java
 Аватар для KEKCoGEN
2399 / 2224 / 565
Регистрация: 28.12.2010
Сообщений: 8,672
14.08.2020, 19:10
Цитата Сообщение от Vhodnoylogin Посмотреть сообщение
Возможно, что моя логика "стрим == связный список" в корне неверна.
this.

Никакой смены типа нет
Java
1
<R> Stream<R> map(Function<? super T, ? extends R> mapper);
вот тут на стриме <T> проходит операция маппинга в стрим <R>. Например у тебя есть лист типов Integer и тебе надо замапить в лист типа String

Java
1
2
3
4
5
6
7
    private List<String> map(List<Integer> original) {
        List<String> resultList = new ArrayList<>();
        for (Integer integer : original) {
            resultList.add(integer + "");
        }
        return resultList;
    }
По сути тут была "смена типа", но на самом деле это просто другая коллекция.

Стримы это не более чем синтактический сахар. Обертка для удобства и сокращения кода
0
528 / 263 / 70
Регистрация: 11.12.2016
Сообщений: 1,223
15.08.2020, 02:02
Цитата Сообщение от KEKCoGEN Посмотреть сообщение
Стримы это не более чем синтактический сахар. Обертка для удобства и сокращения кода
А разве когда они вводились не говорилось что они еще и быстрее работают, ну там выгоды внутриннего итерирования, и это не просто цикл, и предостеригали что forEach() при параллельной работе не гарантирует последовательность выполнения?
0
Эксперт Java
 Аватар для KEKCoGEN
2399 / 2224 / 565
Регистрация: 28.12.2010
Сообщений: 8,672
15.08.2020, 10:31
ViktorFX, последовательность выполнения при параллельном выполнении это так то противоположные вещи))) Где-то давно читал бенчмарк стримов и циклов, разница действительно есть там, но не супер большая
0
-12 / 3 / 0
Регистрация: 02.04.2012
Сообщений: 347
15.08.2020, 17:01  [ТС]
Цитата Сообщение от KEKCoGEN Посмотреть сообщение
По сути тут была "смена типа", но на самом деле это просто другая коллекция.
Сам стрим работает как отложенные вычисления: сначала набирается список изменений, а потом уже сами вычисления.

И я не могу написать (понять), как сделать этот список изменений. Если бы тип не менялся, то все было бы просто:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class StreamNode<T> {
    protected StreamNode<T> nextNode;
    protected Function<T,Boolean> func;
    
    protected void setFunction(Function<T,Boolean> func){
        this.func = func;
    }
    
    public StreamNode<T> filter(Function<T,Boolean> filter){
        StreamNode<T> next = new StreamNode<>();
        next.setFunction(filter);
        this.nextNode = next;
        return next;
    }
}

А вот, когда юзается мап - там меняется тип параметра. И все ломается:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class StreamNodeMap<T> extends StreamNode<T> {
    protected StreamNode<T> nextNode;
    protected Function<T, WAT???> func; // ВОТ ЭТА СТРОЧКА НЕ РАБОТАЕТ.
    
    protected void setFunction(Function<T,Boolean> func){
        this.func = func;
    }
    
    public <R> StreamNode<R> map(Function<T,R> map){
        StreamNode<R> next = new StreamNode<>();
        next.setFunction(map);
        this.nextNode = next; // ВОТ ЭТА СТРОЧКА НЕ РАБОТАЕТ.
        return next;
    }
}
Тут сразу две проблемы:
1. как хранить функцию map, если результирующий параметр-тип появляется только в методе
2. мы не сможем связать текущий нод и следующий, потому что они разного типа. Он хочет T, а получает R.
0
Эксперт функциональных языков программированияЭксперт Java
 Аватар для korvin_
4575 / 2774 / 491
Регистрация: 28.04.2012
Сообщений: 8,779
15.08.2020, 17:50
Vhodnoylogin, почему бы тебе не заглянуть в исходники OpenJDK, например, и посмотреть, как реализован ArrayList.stream?
0
-12 / 3 / 0
Регистрация: 02.04.2012
Сообщений: 347
18.08.2020, 18:30  [ТС]
Долго мучился, и все-таки додумался.
Java
1
class StreamNode<IN, OUT, S extends StreamWithException<IN>> implements StreamWithException<OUT>
Все проблема была в том, что я путал текущую ноду и следующую.

Я думал, что медоты фильтра, мапа и так далее должны относится к текущему узлу. Но нет - мы формируем следующий шаг нашего стрима.

Полный код, он еще не доработан в смысле бросания эксепшенов. Но как стрим он уже рабочий.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
18.08.2020, 18:30
Помогаю со студенческими работами здесь

Смена типов ячеек в Excel средствами delphi
Доброго времени суток. Хочу изменить тип ячеек в Excel на числовой, но при попытке отработать код получаю сообщение вида: Method...

Как он устроен?
Как он устроен? Как происходит процесс обучения? Я предполагаю:учим основы,а остальное библиотеки и модули или что? Объясните...

Компонент JEDI: jvDriveCombo - динамическая смена типов дисков
В свойствах компонента, есть возможность выбора, какие типы дисков будут выводится в комбо (dtFixed, dtCdRom и.т.д). Мне нужно менять эти...

Как устроен web
Здравствуйте!прошу прощения за размещение темы возможно в несоответствующем разделе Подскажите пожалуйста литературу(или другой...

Как устроен QtCreator
кто нибудь знает как устроен QtCreator? объясню что имею ввиду, ставлю QtCreator на armbian( это такая разновидность линукс) простая...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. На мобильном - сканируйте QR-код. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru