powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / Java [игнор отключен] [закрыт для гостей] / Java Stream Api вернуть сумму и список за один проход. Оптимизация
6 сообщений из 6, страница 1 из 1
Java Stream Api вернуть сумму и список за один проход. Оптимизация
    #39859685
serzuzekno
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
class Foo{
  int d;
  String n;
  int s;
  Foo(int d, String n, int s){
     this.d = d;
     this.n = n;
     this.s = s;
  }
}

List<Foo> foos = new ArrayList<>();
foos.add(new Foo(1, "a", 10));
foos.add(new Foo(1, "a", 15));
foos.add(new Foo(2, "b", 40));
foos.add(new Foo(3, "c", 60));
foos.add(new Foo(2, "b", 10));



Нужно получить List<Pair<Foo, Integer>>.
В value-Integer сумма всех s по d.

Возможно ли получить сумму s сгруппированную по d и одновременно вернуть сам список.

Если делать groupingBy(f->f.a) то получаем Integer a, List<Foo>

Как бы тут ещё получить сразу и сумму s. Ведь проход и так происходит при группировке по a.
...
Рейтинг: 0 / 0
Java Stream Api вернуть сумму и список за один проход. Оптимизация
    #39859688
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
serzuzekno,
Чет я не понял. А где тут Stream?
...
Рейтинг: 0 / 0
Java Stream Api вернуть сумму и список за один проход. Оптимизация
    #39859700
serzuzekno
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
PetroNotC Sharp, будет. Доберусь до работы)
...
Рейтинг: 0 / 0
Java Stream Api вернуть сумму и список за один проход. Оптимизация
    #39859706
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
serzuzekno,
Аааа, дак это не вопрос, а описание как ты проводишь день))))). Понял.
...
Рейтинг: 0 / 0
Java Stream Api вернуть сумму и список за один проход. Оптимизация
    #39859726
забыл ник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
reduce()
...
Рейтинг: 0 / 0
Java Stream Api вернуть сумму и список за один проход. Оптимизация
    #39859730
serzuzekno
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
существующее решение:

Код: 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.
import javafx.util.Pair;
import java.util.*;
import java.util.stream.Collectors;

class Foo{
    int d;
    String n;
    int s;
    Foo(int d, String n, int s){this.d = d; this.n = n; this.s = s; }
    public String toString() {return "d " + d + ",n " + n + ",s " + s;}
}
public class Main {

    public static void main(String[] args) {
        List<Foo> foos = new ArrayList<>();
        foos.add(new Foo(1, "a", 10));
        foos.add(new Foo(1, "a", 15));
        foos.add(new Foo(2, "b", 40));
        foos.add(new Foo(3, "c", 60));
        foos.add(new Foo(2, "b", 10));      
    }


}



трубуется результат

Код: java
1.
2.
3.
4.
5.
25=d 1,n a,s 10
25=d 1,n a,s 15
50=d 2,n b,s 40
50=d 2,n b,s 10
60=d 3,n c,s 60



вариант1
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
  
foos.stream()
                .collect(Collectors.groupingBy(foo -> foo.d))
                .values()
                .stream()
                .map(l -> new Pair<>(l.stream().mapToInt(f -> f.s).sum(), l))
                .flatMap(p -> p.getValue().stream().map( f-> new Pair<>(p.getKey(),f) ))
                .forEach(System.out::println);



вариант2, выглядит оптимальнее, но громоздко. Тут делим список по ключу и сразу суммируем
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
        
foos.stream()
                .collect(Collectors.toMap(f -> f.d
                                    , f -> new Pair<>(f.s, new ArrayList<>(Collections.singletonList(f)))
                                    , (p, p2) -> {
                                            p.getValue().addAll(p2.getValue());
                                            return new Pair<>(p.getKey() + p2.getKey(), p.getValue());
                                        }
                        )
                ).values()
                .stream()
                .flatMap(p -> p.getValue().stream().map( f-> new Pair<>(p.getKey(),f) ))
                .forEach(System.out::println);




суть вопроса - можно ли как то написать красивый стрим как в 1ом варианте, но оптимизированный как во втором
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / Java Stream Api вернуть сумму и список за один проход. Оптимизация
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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