|
SOLID & немного Spring'a
|
|||
---|---|---|---|
#18+
Здравствуйте, решал небольшую задачку чисто из спортивного интереса и залип на одном моменте. Все работает, но один кусок кода уж очень костыльный, а как исправить не знаю :( Суть задачки в чем: дается линк, там массив json типа Код: xml 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22.
Далее по линкам в каждом объекте еще один объект, их надо вытащить и поставить на место этого линка, то-есть вот это Код: xml 1. 2. 3. 4. 5.
нужно преобразовать в это: Код: xml 1. 2. 3. 4. 5. 6. 7.
Контроллер: Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19.
Сервис: Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30.
Вспомогательный класс (с костылем): Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45.
Я не прошу прям кода, просьба хотя бы на словах объяснить, как эту логику с помощью абстракций реализовать) Спасибо! ... |
|||
:
Нравится:
Не нравится:
|
|||
07.12.2021, 23:23 |
|
SOLID & немного Spring'a
|
|||
---|---|---|---|
#18+
bobo96, Можете воспользоваться библиотекой из соседней ветки . Такое решение: Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35.
Результат: Код: javascript 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26.
... |
|||
:
Нравится:
Не нравится:
|
|||
08.12.2021, 04:55 |
|
SOLID & немного Spring'a
|
|||
---|---|---|---|
#18+
В новой версии библиотеки можно будет не добавлять приведение типов. Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32.
... |
|||
:
Нравится:
Не нравится:
|
|||
08.12.2021, 05:30 |
|
SOLID & немного Spring'a
|
|||
---|---|---|---|
#18+
Для списка объектов такой код: Код: java 1. 2. 3. 4. 5. 6. 7.
... |
|||
:
Нравится:
Не нравится:
|
|||
08.12.2021, 05:38 |
|
SOLID & немного Spring'a
|
|||
---|---|---|---|
#18+
По вопросу: для комбинации CompletableFuture есть к примеру метод CompletableFuture#thenCombine . Да и зачем две штуки CompleteableFuture запихивать в Stream и бегать по ним циклом? Не по вопросу: - Gson может сразу массив парсить - зачем JSONArray тащить - Из константы можно получить CompletableFuture из CompletableFuture#completedFuture - зачем AsyncResult тащить? - Если используется vertx, то у него есть http client, который может сдлеать запрос асинхронно и не нужен будет @Async - Вызов метода с @Async не будет выполнятся асинхронно , при вызове из того же класса (скорее всего тут такой же кейс как по ссылке) - Вполне можно подумать над тем, чтобы возвращать CompletableFuture из контроллера без промежуточных join вообще. join блочит поток, и если он есть в коде, то можно выстрелить легко ошибиться и сделать что-то не то. Поэтому от него лучше уходить максимально ... |
|||
:
Нравится:
Не нравится:
|
|||
08.12.2021, 13:53 |
|
SOLID & немного Spring'a
|
|||
---|---|---|---|
#18+
Всем огромное спасибо за советы. Один вопрос: SpringMan - Вполне можно подумать над тем, чтобы возвращать CompletableFuture из контроллера без промежуточных join вообще. join блочит поток, и если он есть в коде, то можно выстрелить легко ошибиться и сделать что-то не то. Поэтому от него лучше уходить максимально Вот тут не понял, как такое реализовывать.. К примеру запустили мы 5 потоков, каким способом отследить все и вернуть результат только когда все потоки выполнились ? ... |
|||
:
Нравится:
Не нравится:
|
|||
08.12.2021, 16:51 |
|
SOLID & немного Spring'a
|
|||
---|---|---|---|
#18+
bobo96 Вот тут не понял, как такое реализовывать.. К примеру запустили мы 5 потоков, каким способом отследить все и вернуть результат только когда все потоки выполнились ? Есть два метода: CompletableFuture#thenCombine - может объединить результат нескольких CompletableFuture в одну CompletableFuture CompletableFuture#thenCompose - может создать новую future после того, когда будет получен результат текущей Псевдокод: Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.
Код само собой я не компилировал. Внутри thenCompose рождаются две future, а их результат объединяется через thenCombine. Мой пример короче чем нужно, но суть думаю ясна ... |
|||
:
Нравится:
Не нравится:
|
|||
08.12.2021, 17:47 |
|
|
start [/forum/topic.php?fid=59&msg=40118489&tid=2120294]: |
0ms |
get settings: |
10ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
366ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
51ms |
get tp. blocked users: |
1ms |
others: | 303ms |
total: | 768ms |
0 / 0 |