Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / stream->map to completablefuture join all get object / 17 сообщений из 17, страница 1 из 1
14.03.2018, 19:01
    #39614972
Atum1
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
stream->map to completablefuture join all get object
добрый день , как построить такой 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
14.03.2018, 19:20
    #39614980
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
stream->map to completablefuture join all get object
А это обязательное требование, чтобы дождаться всех, прежде чем сохранять в БД?
...
Рейтинг: 0 / 0
14.03.2018, 19:29
    #39614985
Atum1
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
stream->map to completablefuture join all get object
BlazkowiczА это обязательное требование, чтобы дождаться всех, прежде чем сохранять в БД?

Да.

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


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


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

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

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


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


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


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

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

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

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

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

CompletableFuture.allOf(futures).join();

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

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


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

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

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


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

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

Спасибо :)

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

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

ps

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

С фига ли? Нет там никакой магии. Тормозить будет только если кто-то не может начать что-то делать пока ждет остальных. Но идея-то не в этом. Сначала нужно выполнить задачу, а потом уже ждать предыдущий future.
...
Рейтинг: 0 / 0
16.03.2018, 12:11
    #39615886
Atum1
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
stream->map to completablefuture join all get object
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
16.03.2018, 12:12
    #39615889
Atum1
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
stream->map to completablefuture join all get object
...
Рейтинг: 0 / 0
16.03.2018, 12:20
    #39615897
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
stream->map to completablefuture join all get object
Atum1,

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

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


ок я понял .

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


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