powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / stream->map to completablefuture join all get object
17 сообщений из 17, страница 1 из 1
stream->map to completablefuture join all get object
    #39614972
Atum1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
добрый день , как построить такой pipeline :

stream->map to completablefuture join all -> get object

Есть коллекция Enitity -> List<Enitity>

Есть сервис куда их нужно передать он изменят их состояние , что то с ними делает ,

Есть сервис который их сохраняет в базу .

Enitity Spring repository

Для примера :

Код: 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.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
class Person {

        public String firstName;
        public String lastName;
        public String fullName;

        @Override
        public String toString() {
            return firstName + " " + lastName;
        }

        public Person(String firstName, String lastName) {
            this.firstName = firstName;
            this.lastName = lastName;

        }

    }

    private static Person renamePerson(Person p) {
        p.fullName = p.firstName + " : " + p.lastName;
        return p;

    }


    @Test
    public void testMap() {

        final ThreadFactory threadFactory = new ThreadFactoryBuilder()
                .setNameFormat("Поток-%d")
                .setDaemon(true)
                .build();

        final ExecutorService es = Executors.newFixedThreadPool(2, threadFactory);

        List<Person> persons = Arrays.asList(new Person("1", "2"), new Person("3", "4"));




//1
        CompletableFuture[] futures
                = 
                        persons.stream()
                        .map(p -> CompletableFuture.supplyAsync(
                        () -> renamePerson((Person) p), es))
                        .map(f -> f.thenAccept(System.out::println))
                        .toArray(size -> new CompletableFuture[size]);
//2
        CompletableFuture.allOf(futures).join();
        
             
 //3    тут сохраняем в базу 
        persons.stream().forEach(p -> System.out.println(p.fullName));





Хочется сделать 1+ 2 + 3 в одном стриме , вопрос как ?

чтобы не терять тип и не получать на 2 шаге CompletableFuture<Void> видимо

а вернуть CompletableFuture<Person> ...
...
Рейтинг: 0 / 0
stream->map to completablefuture join all get object
    #39614980
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А это обязательное требование, чтобы дождаться всех, прежде чем сохранять в БД?
...
Рейтинг: 0 / 0
stream->map to completablefuture join all get object
    #39614985
Atum1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczА это обязательное требование, чтобы дождаться всех, прежде чем сохранять в БД?

Да.

Как сохранять тут же это ясно - просто в методе renamePerson делать save .


Мы не тратим ресурса БД , а в конце делаем такой балк.


Как вариант сохранять балками в отельном потоке набирая их по 100 шт , не дожидаясь всех ... но это сложно.
...
Рейтинг: 0 / 0
stream->map to completablefuture join all get object
    #39614987
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Atum1,

не знаю, сработает ли, но можно попробовать вывести ссылку на CompletableFuture и залинковать их один на другого, чтобы join ждал себя+предыдущего и таким образом ждал всех для последнего в стриме. А после этого уже вытащить результат и сохранить.

Но, в целом, упрощать код жертвуя его читаемостью не очень хорошо.
...
Рейтинг: 0 / 0
stream->map to completablefuture join all get object
    #39615080
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я-бы так не делал. По возможности.
Код: java
1.
2.
3.
4.
 private static Person renamePerson(Person p) {
        p.fullName = p.firstName + " : " + p.lastName;
        return p;
    }


Концепция Streams предполагает аккуратную работу с аргументом. Без модификации экземпляра.
Лучше конструировать новый объект. Или завести геттер кототрый решает задачу.
...
Рейтинг: 0 / 0
stream->map to completablefuture join all get object
    #39615106
Atum1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonЯ-бы так не делал. По возможности.
Код: java
1.
2.
3.
4.
 private static Person renamePerson(Person p) {
        p.fullName = p.firstName + " : " + p.lastName;
        return p;
    }


Концепция Streams предполагает аккуратную работу с аргументом. Без модификации экземпляра.
Лучше конструировать новый объект. Или завести геттер кототрый решает задачу.


Спасибо. Это скорее пример для описания проблемы :

У высесть объект вы его взяли из бд что то с ним сделали и хотите сохранить изменения обратно в базу ( например изменили возраст )
...
Рейтинг: 0 / 0
stream->map to completablefuture join all get object
    #39615108
Atum1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczAtum1,

не знаю, сработает ли, но можно попробовать вывести ссылку на CompletableFuture и залинковать их один на другого, чтобы join ждал себя+предыдущего и таким образом ждал всех для последнего в стриме. А после этого уже вытащить результат и сохранить.

Но, в целом, упрощать код жертвуя его читаемостью не очень хорошо.

А тут вопрос такой join будет сильно тормозить ,
Нудно посмотреть как реализован

CompletableFuture.allOf(futures).join();

Что то интересно стало
...
Рейтинг: 0 / 0
stream->map to completablefuture join all get object
    #39615112
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Atum1Спасибо. Это скорее пример для описания проблемы :

У высесть объект вы его взяли из бд что то с ним сделали и хотите сохранить изменения обратно в базу ( например изменили возраст )
Блинн.. я старый базовик просто хватаюсь за голову видя такие синтетические
постановки.. Тоесть то что можно сделать через
Код: java
1.
SQL> update person set fullname=concat(lastname,' ',firstname);


ты делаешь через пул потоков и конвейер операций?

Дружище Атум. Давай я тебе буду придумывать задачи. И постараюсь даже поискать в них бизнес-value
и здравый смысл.
...
Рейтинг: 0 / 0
stream->map to completablefuture join all get object
    #39615210
Atum1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonAtum1Спасибо. Это скорее пример для описания проблемы :

У высесть объект вы его взяли из бд что то с ним сделали и хотите сохранить изменения обратно в базу ( например изменили возраст )
Блинн.. я старый базовик просто хватаюсь за голову видя такие синтетические
постановки.. Тоесть то что можно сделать через
Код: java
1.
SQL> update person set fullname=concat(lastname,' ',firstname);


ты делаешь через пул потоков и конвейер операций?

Дружище Атум. Давай я тебе буду придумывать задачи. И постараюсь даже поискать в них бизнес-value
и здравый смысл.

Спасибо :)

Может к нам на работу придете ?

Без шуток (Москва , офис , 200k+ )

ps

еще раз - там конечно не Person - а более сложный объект .
...
Рейтинг: 0 / 0
stream->map to completablefuture join all get object
    #39615238
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нет уж спасибо. Не надо мне такого счастья.
...
Рейтинг: 0 / 0
stream->map to completablefuture join all get object
    #39615250
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Atum1А тут вопрос такой join будет сильно тормозить ,
Нудно посмотреть как реализован
CompletableFuture.allOf(futures).join();

С фига ли? Нет там никакой магии. Тормозить будет только если кто-то не может начать что-то делать пока ждет остальных. Но идея-то не в этом. Сначала нужно выполнить задачу, а потом уже ждать предыдущий future.
...
Рейтинг: 0 / 0
stream->map to completablefuture join all get object
    #39615886
Atum1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczAtum1А тут вопрос такой join будет сильно тормозить ,
Нудно посмотреть как реализован
CompletableFuture.allOf(futures).join();

С фига ли? Нет там никакой магии. Тормозить будет только если кто-то не может начать что-то делать пока ждет остальных. Но идея-то не в этом. Сначала нужно выполнить задачу, а потом уже ждать предыдущий future.

эта идея ? .map(t->t.join())

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
package com.concretepage.util.concurrent;
import java.util.Arrays;
import java.util.List;
import java.util.concurrent.CompletableFuture;
public class CompletableFutureOneExample {
    public static void main(String[] args) throws InterruptedException {
        List<Integer> list = Arrays.asList(10,20,30,40);
        list.stream().map(data->CompletableFuture.supplyAsync(()->getNumber(data))).
                map(compFuture->compFuture.thenApply(n->n*n)).map(t->t.join())
                .forEach(s->System.out.println(s));
    }
    private static int getNumber(int a){
        return a*a;
    }
} 
...
Рейтинг: 0 / 0
stream->map to completablefuture join all get object
    #39615889
Atum1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
stream->map to completablefuture join all get object
    #39615897
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Atum1,

Хм. А оно и в простейшем случае будет работать нормально. Я было подумал что нет и нужно будет ухищрятся. А сегодня понимаю что и обычный join будет работать норм.
...
Рейтинг: 0 / 0
stream->map to completablefuture join all get object
    #39615905
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonты делаешь через пул потоков и конвейер операций? непонятна постановка.
Переименовывает ГУИ. Т.е. crud приложение.
При сохранениии изменённого объекта с ФИО орм автоматом все видит и сохраняет.
Про что топик то? ))
...
Рейтинг: 0 / 0
stream->map to completablefuture join all get object
    #39615913
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Atum1еще раз - там конечно не Person - а более сложный объект .
Если вы сами не видете простой апдейт sql, вам нужен любой бд разработчик хотя бы для консультаций за 100к.
...
Рейтинг: 0 / 0
stream->map to completablefuture join all get object
    #39616108
Atum1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczAtum1,

Хм. А оно и в простейшем случае будет работать нормально. Я было подумал что нет и нужно будет ухищрятся. А сегодня понимаю что и обычный join будет работать норм.


ок я понял .

Всем спасибо .
тему можно закрывать
...
Рейтинг: 0 / 0
17 сообщений из 17, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / stream->map to completablefuture join all get object
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]