Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Преобразование вложенных циклов в Java 8 stream / 25 сообщений из 28, страница 1 из 2
23.09.2018, 13:36
    #39706536
Kopranych
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Преобразование вложенных циклов в Java 8 stream
Как преобразовать данный код в Java 8 stream

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
Set<Sector> sectorSet = new LinkedHashSet<>();

for (Sector s : sectorSet) {
            double sumAssetValue = 0;
            for (Stock stock : stocks.getStocks()) {
                if (s.getSector().equals(stock.getSector())) {
                    sumAssetValue += stock.getAssetValue();
                }
            }
            s.setAssetValue((int)Math.round(sumAssetValue));
            allocationSector.getAllocations().add(s);
        }



у меня получилось вот так, но это как то совсем не то, да и не работает

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
sectorSet.forEach(sector -> {
            double sumAssetValue = 0;
            stocks.getStocks().stream()
            .filter(stock -> sector.getSector().equals(stock.getSector()))
                .forEach(stock -> allocationSector += stock.getAssetValue());
                sector.setAssetValue((int)Math.round(sumAssetValue));
                allocationSector.getAllocations().add(sector);
        });
...
Рейтинг: 0 / 0
23.09.2018, 13:47
    #39706540
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Преобразование вложенных циклов в Java 8 stream
Kopranych, у тебя был превосходный код. Его надо было разбить на 2 процедуры которые работают с коллекциями.
Это в лучших традициях рефакторинга.

А ты из него сделал нечитабельную фигню. Зачем тулить Streams везде где ни попадя?
...
Рейтинг: 0 / 0
23.09.2018, 14:05
    #39706544
Kopranych
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Преобразование вложенных циклов в Java 8 stream
mayton,
можешь на примере показать рефакторинг моего кода?
...
Рейтинг: 0 / 0
23.09.2018, 14:10
    #39706545
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Преобразование вложенных циклов в Java 8 stream
До того как мы начнем. Я спрошу вопрос.

Ты суммы денег всегда считаешь в double?
...
Рейтинг: 0 / 0
23.09.2018, 14:17
    #39706548
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Преобразование вложенных циклов в Java 8 stream
И еще один вопрос. Читал ли ты книгу Кея Хостмана - Java SE 8 базовый курс?
...
Рейтинг: 0 / 0
23.09.2018, 14:31
    #39706550
Андрей Панфилов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Преобразование вложенных циклов в Java 8 stream
Kopranych,

нужно взять stocks, опционально отфильтровать их по секторам, а потом сложить:
Код: java
1.
.collect(Collectors.groupingBy(stock -> stock.getSector(), Collectors.summingDouble(stock->stock.getAssetValue())))


после чего затащить суммы в сектора
...
Рейтинг: 0 / 0
23.09.2018, 15:04
    #39706554
Kopranych
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Преобразование вложенных циклов в Java 8 stream
maytonИ еще один вопрос. Читал ли ты книгу Кея Хостмана - Java SE 8 базовый курс?
Нет эту книгу не читал, обязательно начну!
...
Рейтинг: 0 / 0
23.09.2018, 16:05
    #39706563
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Преобразование вложенных циклов в Java 8 stream
KopranychmaytonИ еще один вопрос. Читал ли ты книгу Кея Хостмана - Java SE 8 базовый курс?
Нет эту книгу не читал, обязательно начну!
Тогда проще. С любезного разрешения господина Хорстмана я сделаю цитату.

Java SE 8 базовый курс - Глава 82. Потоковые операции не изменяют их источник. Например метод filter() не удаляет элементы
из нового потока данных но выдает новый поток в котором они отсутствуют.

Я прокомментирую. Корни этого пункта уходят в функционально программирование. В частности
такие методы как map/fold/reduce изначально не имеют отношения к Java. Их разные вариации были в Scala,
Haskell и прочих языках которые очень аккуратно относятся к функциям и к purity.

Поэтому такой фрагмент кода
Код: java
1.
sector.setAssetValue((int)Math.round(sumAssetValue));


нарушает правило номер 2. К каким последствиям это приведёт для твоего кода?
Скорее всего ни к каким но в целом для парадигмы Streams данное поведения я-бы счел
нежелательным. Это такой себе Stream-smell. И на code-review он бы вызвал
вопросы.
...
Рейтинг: 0 / 0
23.09.2018, 16:08
    #39706564
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Преобразование вложенных циклов в Java 8 stream
Kopranychmayton,
можешь на примере показать рефакторинг моего кода?
По поводу рефакторинга. Я готов попробовать "развалить" твой волшебный метод на два метода.
Убежден что после этого мы хотя-бы понизим комплексность. Но ты поставил меня в сложное
положение. Мне придётся самому создать такие сущности как Sector и Stock. Мне это делать
лень поэтому я прошу тебя привести кусок кода с этими зависимостями.
...
Рейтинг: 0 / 0
23.09.2018, 16:46
    #39706571
Kopranych
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Преобразование вложенных циклов в Java 8 stream
mayton,
вот класс Sector
Код: java
1.
2.
3.
4.
5.
6.
@Data
public class Sector {
    private String sector;
    private int assetValue;
    private float proportion;
}


класс Stock
Код: java
1.
2.
3.
4.
5.
6.
7.
@Data
public class Stock {
    private String symbol;
    private int volume;
    transient double assetValue;
    transient String sector;
}
...
Рейтинг: 0 / 0
23.09.2018, 17:11
    #39706573
Андрей Панфилов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Преобразование вложенных циклов в Java 8 stream
Kopranych,

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
Set<Sector> sectorSet = new LinkedHashSet<>();
List<Stock> stockList = new ArrayList<>();

Map<String, Sector> sectors = sectorSet.stream()
    .collect(Collectors.toMap(Sector::getSector, Function.identity()));

stockList.stream().filter(stock -> sectors.containsKey(stock.getSector()))
    .collect(groupingBy(Stock::getSector, summingDouble(Stock::getAssetValue))).forEach((k, v) -> {
      Sector sector = sectors.get(k);
      sector.setAssetValue(v.intValue());
      allocationSector.getAllocations().add(sector);
    });
...
Рейтинг: 0 / 0
23.09.2018, 17:20
    #39706577
Kopranych
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Преобразование вложенных циклов в Java 8 stream
Андрей Панфилов,
Спасибо за решение!
А еще говорят, что функциональное программирование более проще читается, по мне так мой вариант в обычном стиле более проще в понимании
...
Рейтинг: 0 / 0
23.09.2018, 21:02
    #39706669
забыл ник
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Преобразование вложенных циклов в Java 8 stream
KopranychА еще говорят, что функциональное программирование более проще читается, по мне так мой вариант в обычном стиле более проще в понимании
Так и есть, просто код приведенный выше далек от функционального программирования
...
Рейтинг: 0 / 0
24.09.2018, 01:02
    #39706724
Cheblin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Преобразование вложенных циклов в Java 8 stream
авторА еще говорят, что функциональное программирование более
да потому что это JAVA-корявые языковые конструкции
пиши в SCALA и всё будет красиво.
...
Рейтинг: 0 / 0
24.09.2018, 11:51
    #39706879
andreykaT
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Преобразование вложенных циклов в Java 8 stream
забыл никKopranychА еще говорят, что функциональное программирование более проще читается, по мне так мой вариант в обычном стиле более проще в понимании
Так и есть, просто код приведенный выше далек от функционального программирования
всё больше убеждаюсь что у каждого свой взгляд на понятие функционального программирования ))

по мне так это дичь само по себе которая толком пока не выстрелила (и не факт что выстрелит вообще) ну и джава для фп так себе подходит. слишком архаична.
...
Рейтинг: 0 / 0
24.09.2018, 12:00
    #39706891
забыл ник
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Преобразование вложенных циклов в Java 8 stream
Cheblin,
косность языковых конструкций java там не самая большая проблема.
...
Рейтинг: 0 / 0
24.09.2018, 12:06
    #39706896
забыл ник
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Преобразование вложенных циклов в Java 8 stream
andreykaTвсё больше убеждаюсь что у каждого свой взгляд на понятие функционального программирования ))

Отнюдь, когда начинаешь в нем разбираться, основные принципы кристаллизуются в мозгу и по ним особых разногласий ни у кого нет
andreykaTпо мне так это дичь само по себе которая толком пока не выстрелила (и не факт что выстрелит вообще) ну и джава для фп так себе подходит. слишком архаична.
Ну это частая проблема - делать суждения в темах, которых не особо разбираешься.
В конкретном коде во время итерирования, объект Sector изменяется, одно это уже мимо ФП, не говоря о том, что зачем-то обновляется еще и сторонний объект(allocationSector.getAllocations().add(sector);)
Так что не стоит удивляться говну на выходе.
По поводу того что джава не подходит для фп - соглашусь.
...
Рейтинг: 0 / 0
24.09.2018, 12:33
    #39706917
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Преобразование вложенных циклов в Java 8 stream
andreykaTзабыл никпропущено...

Так и есть, просто код приведенный выше далек от функционального программирования
всё больше убеждаюсь что у каждого свой взгляд на понятие функционального программирования ))

по мне так это дичь само по себе которая толком пока не выстрелила (и не факт что выстрелит вообще) ну и джава для фп так себе подходит. слишком архаична.
Если сравнить иерархию типов Scala c структурой примитивных типов и базовых классов Java то начнёшь ощущать эдакую лёгкую зависть к scala.
...
Рейтинг: 0 / 0
24.09.2018, 12:34
    #39706920
andreykaT
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Преобразование вложенных циклов в Java 8 stream
Я понимаю о чем ты говоришь. и да, я и не претендую на то что уже получил ФП головного мозга. У меня пока скорее ООП ГМ. вот всё стараюсь, но практически применить или развить навыки пока особо негде.
...
Рейтинг: 0 / 0
24.09.2018, 13:24
    #39706958
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Преобразование вложенных циклов в Java 8 stream
andreykaTЯ понимаю о чем ты говоришь. и да, я и не претендую на то что уже получил ФП головного мозга. У меня пока скорее ООП ГМ. вот всё стараюсь, но практически применить или развить навыки пока особо негде.
Аналогично. У меня тоже нету продуктовых задач где юзается ФП. Поэтому для меня ФП - пока только хобби.
Правда был опыт интенсивного юзания XML/XPath и в хвост и в гриву. Но там такое ФП. Весьма специфичное.
...
Рейтинг: 0 / 0
24.09.2018, 13:36
    #39706969
забыл ник
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Преобразование вложенных циклов в Java 8 stream
andreykaTЯ понимаю о чем ты говоришь. и да, я и не претендую на то что уже получил ФП головного мозга. У меня пока скорее ООП ГМ. вот всё стараюсь, но практически применить или развить навыки пока особо негде.

Самое смешное, что ООП и ФП подходы это просто разные Church Encodings одного и того же, просто взгляд с разных углов. Прочитать можно тут - https://underscore.io/blog/posts/2017/06/02/uniting-church-and-state.html
Большинство принципов ФП есть хороший тон и в ООП(иммутабельность, pure functions, referential transaprense и тд), просто ФП позволяет довольно четко отделить мух от котлет, а ООП позволяет вольности
...
Рейтинг: 0 / 0
24.09.2018, 15:53
    #39707148
cossack5
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Преобразование вложенных циклов в Java 8 stream
Используя C# LINQ данный код можно было записать в один statement.
...
Рейтинг: 0 / 0
24.09.2018, 16:15
    #39707172
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Преобразование вложенных циклов в Java 8 stream
cossack5Используя C# LINQ данный код можно было записать в один statement.
Давай
...
Рейтинг: 0 / 0
27.09.2018, 23:23
    #39709574
cossack5
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Преобразование вложенных циклов в Java 8 stream
maytoncossack5Используя C# LINQ данный код можно было записать в один statement.
Давай
Вроде так (если ничего не упустил):
Код: c#
1.
2.
3.
4.
5.
  (from stock in stocks 
			join sector in sectors on stock.sector equals sector.sector
	 group stock by stock.sector into res
	 select new Sector { sector = res.Key, assetValue = res.Sum(_ => (int) _.assetValue) } )
	 .ToList().ForEach(s=> allocationSector.allocations.Add(s) );



Весь код
Код: c#
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.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
void Main()
{
	AllocationSector allocationSector = new AllocationSector();

	var sectors = new HashSet<Sector>() {
		new Sector {sector="A"},
		new Sector {sector="B"}
		
	};
	
	
	var stocks = new HashSet<Stock>() {
		new Stock {sector="A", assetValue=20, symbol="1"},
		new Stock {sector="A", assetValue=295, symbol="15"},
		new Stock {sector="A", assetValue=16, symbol="19"},
		new Stock {sector="B", assetValue=30, symbol="2"},
		new Stock {sector="B", assetValue=50, symbol="3"},
		new Stock {sector="B", assetValue=21, symbol="35"},
		new Stock {sector="B", assetValue=45, symbol="13"},
		new Stock {sector="G", assetValue=45, symbol="143"}
	};

	//cycle(sectors, stocks);
	doUsingLINQ(sectors, stocks, allocationSector);
	
	
	
}

void doUsingLINQ(HashSet<Sector> sectors,  HashSet<Stock> stocks, AllocationSector allocationSector)
{
	(from stock in stocks
	 join sector in sectors on stock.sector equals sector.sector
	 group stock by stock.sector into res
	 select new Sector { sector = res.Key, assetValue = res.Sum(_ => (int)_.assetValue) })
  .ToList().ForEach(s => allocationSector.allocations.Add(s));
  
  allocationSector.Dump();
 
}
void cycle(HashSet<Sector> sectors,  HashSet<Stock> stocks, AllocationSector allocationSector)
{
	foreach (var sector in sectors)
	{
		double sumAssetValue = 0;
		foreach (Stock stock in stocks)
		{
			if (sector.sector == stock.sector)
			{
				sumAssetValue += stock.assetValue;
			}
		}
		sector.assetValue = (int)sumAssetValue;
		allocationSector.allocations.Add(sector);
	}
	
	sectors.Dump();

}

class Sector
{
	public String sector {get; set;}
	public int assetValue {get; set;}
	public float proportion {get; set;}
	
	
}

class Stock
{
	public String symbol {get;set;}
	public int volume  {get;set;}
	public double assetValue  {get;set;}
	 public String sector  {get;set;}
}

class AllocationSector
{
	public List<Sector> allocations = new List<Sector>();
}


...
Рейтинг: 0 / 0
27.09.2018, 23:37
    #39709577
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Преобразование вложенных циклов в Java 8 stream
Хм... даже не знаю. По идее мне должен нравится псевдо-SQL-ный вариант.

Но код Панфилова кажется более clear с точки зрения ресурсов. Тоесть я понимаю
что там примерно под капотом и какие накладные расходы.

А этот Линк. Как он делает JOINS ? Он должен вовлекать в работу искусственные
структуры данных чтобы JOIN отработал успешно. А если секторов и стоков
будет в сто-крат больше? Как он себя поведет?
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / Преобразование вложенных циклов в Java 8 stream / 25 сообщений из 28, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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