|
4 / 4 / 3
Регистрация: 15.12.2012
Сообщений: 192
|
||||||
Рефакторинг в сторону лямбда-выражения23.08.2017, 12:50. Показов 1077. Ответов 13
Метки нет (Все метки)
Здравствуйте! Недавно начал изучать новые потоковые методы и лямбда выражения в Java.
Столкнулся с проблемой, что не могу сделать правильный рефакторинг старого кода. на данный момент он выглядит так:
frustumEntities - это поле класса, который использует описанный метод, с типом Map<Float, List<IEntity>>.
0
|
||||||
| 23.08.2017, 12:50 | |
|
Ответы с готовыми решениями:
13
Лямбда выражения
|
|
3639 / 2971 / 918
Регистрация: 05.07.2013
Сообщений: 14,220
|
|||
| 23.08.2017, 15:21 | |||
|
пользуйся filter->map>collect, пиши функции
0
|
|||
|
4 / 4 / 3
Регистрация: 15.12.2012
Сообщений: 192
|
||||||
| 23.08.2017, 17:19 [ТС] | ||||||
|
Оказывается можно просто сделать так:
this.frustumEntities.putAll(frustumMap); XD А вот тут посложнее:
0
|
||||||
|
3639 / 2971 / 918
Регистрация: 05.07.2013
Сообщений: 14,220
|
|
| 24.08.2017, 00:28 | |
|
Можно Машку за ляжку, что должно делать?
1
|
|
|
4 / 4 / 3
Регистрация: 15.12.2012
Сообщений: 192
|
||
| 24.08.2017, 16:22 [ТС] | ||
|
Данный метод добавляет все сущности из List<IEntity> (getAll()) в Map<Float,List<IEntity>> frustumEntities - входящие в пирамиду видимости. Для того, чтобы они были добавлены, нужно, чтобы выполнялось условие: distance >= 0 && distance < EngineSettings.RENDERING_VIEW_DISTANCE При этом float distance = frustum.distanceSphereInFrustum(entity.g etPosition(), entity.getSphereRadius()); В мапу добавляются distance как ключ и как объект - List<IEntity>, при этом List<IEntity> нужно сформировать из всех IEntity entity, которые прошли проверку. При этом с каждой итерации List<IEntity> из getAll() может быть такое, что в Map<Float,List<IEntity>>frustumEntities уже есть ключ, равный distance данной итерации. Поэтому, если там есть ключ, то извлекается объект как List<IEntity>batch и ему добавляется IEntity entity из данной итерации, а если нет такого ключа, то создается новый List<IEntity>batch и ему также присваивается IEntity entity из данной итерации. А потом batch добавляется в Map<Float,List<IEntity>>frustumEntities
0
|
||
|
502 / 348 / 134
Регистрация: 14.06.2016
Сообщений: 669
|
|
| 24.08.2017, 17:04 | |
|
Такую историю ищешь? https://docs.oracle.com/javase... .Function-
0
|
|
|
4 / 4 / 3
Регистрация: 15.12.2012
Сообщений: 192
|
||
| 24.08.2017, 17:21 [ТС] | ||
|
То можно было бы просто написать getAll().stream() .map(entity->(entity, float distance = ...)) .filter((entity, distance) -> ...>distance<...) Но функция возвращает только одно значение.
0
|
||
|
502 / 348 / 134
Регистрация: 14.06.2016
Сообщений: 669
|
|
| 24.08.2017, 17:35 | |
|
зачем тебе distance таскать?
Function<IEntity, Float> distance = e -> frustum.distanceSphereInFrustum(e.getPos ition(), e.getSphereRadius()); соответственно predicate Predicate<IEntity> predicate = e -> distance.apply(e) >= 0 && distance.apply(e) < ...; И в конце мапа frustumEntities = getAll().stream().filter(predicate::test ).collect(Collectors.groupingBy(distance ::apply));
1
|
|
|
4 / 4 / 3
Регистрация: 15.12.2012
Сообщений: 192
|
|
| 24.08.2017, 17:50 [ТС] | |
|
0
|
|
|
502 / 348 / 134
Регистрация: 14.06.2016
Сообщений: 669
|
|
| 24.08.2017, 18:01 | |
|
Если жизненно важно - напиши какой-нить Pair.
getAll().stream().map(e -> new Pair<IEntity, Float>(e, distance.apply(e))) .... и дальше уже со стримом <Pair> - filter - collect.
0
|
|
|
4 / 4 / 3
Регистрация: 15.12.2012
Сообщений: 192
|
||
| 24.08.2017, 18:43 [ТС] | ||
|
Значит мы получаем на выходи эту пару, Pair<IEntity, Float>(e, distance.apply(e)), у этой пары должны быть методы getFirst и getSecond, потом надо сделать filter(pair -> predicate.test(pair.getFirst)), после надо создать мапу с ключами pair.getFirst и объектом Collectors.toList(pair.getSecond)... я тут не совсем понимаю, что дальше нужно делать. Как создавать лист из этого?
0
|
||
|
502 / 348 / 134
Регистрация: 14.06.2016
Сообщений: 669
|
||||||
| 24.08.2017, 20:39 | ||||||
|
типа такого чего-то
Ты показал только один метод. Посмотри, может в IEntity можно повесить поле distance, тогда отпадают лишние внутренние классы.
1
|
||||||
|
4 / 4 / 3
Регистрация: 15.12.2012
Сообщений: 192
|
|||||||||||||||||
| 29.08.2017, 18:56 [ТС] | |||||||||||||||||
|
Просто я нашел баг и не мог проверить правильность данного кода. Я не могу сделать поле distance для IEntity, потому что это будет нагружать лишней информацией, тем более что distance используется только в данном коде, в данной мапе. И почему-то запись G::valid не работает - приходится писать (group -> group.valid). Но все-таки мне кажется, что создавать внутренний класс в методе не очень продуктивно. Наверно есть другой способ, как элегантно передать distance. Добавлено через 3 часа 49 минут Еще у меня есть такой код:
IntStream.range(0, chunkManager.getSize()) .filter(i -> checkVisibility(frustum, chunkManager.getChunkPosition(i), CHUNK_RADIUS)) .filter(i -> chunkManager.getChunk(i).getIsAcitve()) . -А что надо писать тут, чтобы можно было подцепить еще один цикл for для x, потом также для y и z? Мне нужно передавать туда все i, x, y и z, т.е. нужно сохранять куда-то эти переменные. Я сделал внутренний класс
Добавлено через 2 часа 20 минут Что-то мне подсказывает, что можно еще упростить:
0
|
|||||||||||||||||
|
4 / 4 / 3
Регистрация: 15.12.2012
Сообщений: 192
|
||||||
| 10.09.2017, 09:26 [ТС] | ||||||
|
А как такое упростить?
0
|
||||||
| 10.09.2017, 09:26 | |
|
Помогаю со студенческими работами здесь
14
Лямбда-выражения в Java Лямбда-выражения и ссылки на методы
Лямбда-выражения. Как описать лямбда-процедуру и передать в нее файловую переменную? Лямбда выражения Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Символьное дифференцирование
igorrr37 13.02.2026
/ *
Программа принимает математическое выражение в виде строки и выдаёт его производную в виде строки и вычисляет
значение производной при заданном х
Логарифм записывается как: (x-2)log(x^2+2) -. . .
|
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
|
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу,
и светлой Луне.
В мире
покоя нет
и люди
не могут жить в тишине.
А жить им немного лет.
|
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила»
«Время-Деньги»
«Деньги -Пуля»
|
|
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога
Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
|
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога
Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
|
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога
Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
|
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
|