powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Преобразование вложенных циклов в Java 8 stream
28 сообщений из 28, показаны все 2 страниц
Преобразование вложенных циклов в Java 8 stream
    #39706536
Kopranych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Как преобразовать данный код в 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
Преобразование вложенных циклов в Java 8 stream
    #39706540
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kopranych, у тебя был превосходный код. Его надо было разбить на 2 процедуры которые работают с коллекциями.
Это в лучших традициях рефакторинга.

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

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

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


после чего затащить суммы в сектора
...
Рейтинг: 0 / 0
Преобразование вложенных циклов в Java 8 stream
    #39706554
Kopranych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
maytonИ еще один вопрос. Читал ли ты книгу Кея Хостмана - Java SE 8 базовый курс?
Нет эту книгу не читал, обязательно начну!
...
Рейтинг: 0 / 0
Преобразование вложенных циклов в Java 8 stream
    #39706563
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Преобразование вложенных циклов в Java 8 stream
    #39706564
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kopranychmayton,
можешь на примере показать рефакторинг моего кода?
По поводу рефакторинга. Я готов попробовать "развалить" твой волшебный метод на два метода.
Убежден что после этого мы хотя-бы понизим комплексность. Но ты поставил меня в сложное
положение. Мне придётся самому создать такие сущности как Sector и Stock. Мне это делать
лень поэтому я прошу тебя привести кусок кода с этими зависимостями.
...
Рейтинг: 0 / 0
Преобразование вложенных циклов в Java 8 stream
    #39706571
Kopranych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
Преобразование вложенных циклов в Java 8 stream
    #39706573
Андрей Панфилов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Преобразование вложенных циклов в Java 8 stream
    #39706577
Kopranych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Андрей Панфилов,
Спасибо за решение!
А еще говорят, что функциональное программирование более проще читается, по мне так мой вариант в обычном стиле более проще в понимании
...
Рейтинг: 0 / 0
Преобразование вложенных циклов в Java 8 stream
    #39706669
забыл ник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
KopranychА еще говорят, что функциональное программирование более проще читается, по мне так мой вариант в обычном стиле более проще в понимании
Так и есть, просто код приведенный выше далек от функционального программирования
...
Рейтинг: 0 / 0
Преобразование вложенных циклов в Java 8 stream
    #39706724
Cheblin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
авторА еще говорят, что функциональное программирование более
да потому что это JAVA-корявые языковые конструкции
пиши в SCALA и всё будет красиво.
...
Рейтинг: 0 / 0
Преобразование вложенных циклов в Java 8 stream
    #39706879
andreykaT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
забыл никKopranychА еще говорят, что функциональное программирование более проще читается, по мне так мой вариант в обычном стиле более проще в понимании
Так и есть, просто код приведенный выше далек от функционального программирования
всё больше убеждаюсь что у каждого свой взгляд на понятие функционального программирования ))

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

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

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

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

Самое смешное, что ООП и ФП подходы это просто разные Church Encodings одного и того же, просто взгляд с разных углов. Прочитать можно тут - https://underscore.io/blog/posts/2017/06/02/uniting-church-and-state.html
Большинство принципов ФП есть хороший тон и в ООП(иммутабельность, pure functions, referential transaprense и тд), просто ФП позволяет довольно четко отделить мух от котлет, а ООП позволяет вольности
...
Рейтинг: 0 / 0
Преобразование вложенных циклов в Java 8 stream
    #39707148
cossack5
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Используя C# LINQ данный код можно было записать в один statement.
...
Рейтинг: 0 / 0
Преобразование вложенных циклов в Java 8 stream
    #39707172
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
cossack5Используя C# LINQ данный код можно было записать в один statement.
Давай
...
Рейтинг: 0 / 0
Преобразование вложенных циклов в Java 8 stream
    #39709574
cossack5
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Преобразование вложенных циклов в Java 8 stream
    #39709577
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хм... даже не знаю. По идее мне должен нравится псевдо-SQL-ный вариант.

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

А этот Линк. Как он делает JOINS ? Он должен вовлекать в работу искусственные
структуры данных чтобы JOIN отработал успешно. А если секторов и стоков
будет в сто-крат больше? Как он себя поведет?
...
Рейтинг: 0 / 0
Преобразование вложенных циклов в Java 8 stream
    #39709598
cossack5
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton,

В данной случае - это LINQ To Objects. Согласно сорцам Join'а и и основного файла с linq-логикой создается что-то вроде мапы для каждой итерации верхнего уровня (т.е. sectors). Наверное, не самый эффективный вариант (а чего вы хотели - чудес не бывает). Я в джаве использовал cqengine , где для полей объектов можно создавать индексы (хеш-индексы, префиксное дерево и т.д.) и это работает быстрее (думаю в . NET тоже такое есть).

бенчмарк linq vs non-linq
Код: 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.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
void Main()
{
 	var summary = BenchmarkRunner.Run<Bench>(new AllowNonOptimized());
}

public class AllowNonOptimized : ManualConfig
{
	public AllowNonOptimized()
	{
		Add(JitOptimizationsValidator.DontFailOnError); // ALLOW NON-OPTIMIZED DLLS

		Add(DefaultConfig.Instance.GetLoggers().ToArray()); // manual config has no loggers by default
		Add(DefaultConfig.Instance.GetExporters().ToArray()); // manual config has no exporters by default
		Add(DefaultConfig.Instance.GetColumnProviders().ToArray()); // manual config has no columns by default
	}
}

[RPlotExporter, RankColumn, HtmlExporter]
[SimpleJob(launchCount: 1, warmupCount: 1, targetCount: 5, invocationCount: 10, id: "QuickJob")]
public class Bench
{
	
	static Random rand = new Random();
	
	[GlobalSetup]
	public void Setup()
	{
		allocationSector = new AllocationSector();
		var sectorNames = new HashSet<String>();
		sectors = new HashSet<Sector>();
		
		for (int i=0;i<NumSectors;i++)
		{
			sectorNames.Add(RandomString(2));
		}
		
		foreach (var sectorName in sectorNames)
		{
			sectors.Add(new Sector { sector = sectorName });
		}

		stocks = new HashSet<Stock>();
		var sectorNamesList = sectorNames.ToList();
		for (int i = 0; i < NumStocks; i++)
		{
			stocks.Add(new Stock
			{
				sector = sectorNamesList[rand.Next(0, sectorNames.Count)],
				assetValue = rand.Next(10, 100),
				symbol = i.ToString()
			});
		}
	}

	public static string RandomString(int length)
	{
		const string chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
		return new string(Enumerable.Repeat(chars, length)
		  .Select(s => s[rand.Next(s.Length)]).ToArray());
	}

	[Params(100_000, 1_000_000)]
	public int NumStocks;

	[Params(10, 100, 1_000, 10_000)]
	public int NumSectors;

	private AllocationSector allocationSector;
	private HashSet<Stock> stocks;
	private HashSet<Sector> sectors;


	[Benchmark]
	public void performUsingLINQ()
	{
		(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));

	}

	[Benchmark]
	public void performUsingOneCycle()
	{
		var sectorMap = sectors.ToDictionary(t => t.sector, t => t);
		foreach (var stock in stocks)
		{
			var sector = sectorMap[stock.sector];
			if (sector.sector == stock.sector)
			{
				sector.assetValue += (int)stock.assetValue;
			}
			allocationSector.allocations.Add(sector);
		}

	}
}



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

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

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


Summary
BenchmarkDotNet=v0.11.1, OS=Windows 10.0.17134.285 (1803/April2018Update/Redstone4)
Intel Core i7-7700HQ CPU 2.80GHz (Max: 2.81GHz) (Kaby Lake), 1 CPU, 8 logical and 4 physical cores
[Host] : .NET Framework 4.7.2 (CLR 4.0.30319.42000), 64bit RyuJIT-v4.7.3163.0
QuickJob : .NET Framework 4.7.2 (CLR 4.0.30319.42000), 64bit RyuJIT-v4.7.3163.0

Job=QuickJob InvocationCount=10 IterationCount=5
LaunchCount=1 UnrollFactor=1 WarmupCount=1

Method | NumStocks | NumSectors | Mean | Error | StdDev | Rank |
------------------- |---------- |----------- |-----------:|-----------:|-----------:|-----:|
performUsingLINQ | 100000 | 10 | 20.334 ms | 2.905 ms | 0.7544 ms | 3 |
performUsingOneCycle| 100000 | 10 | 5.963 ms | 4.608 ms | 1.1969 ms | 1 |
performUsingLINQ | 100000 | 100 | 20.963 ms | 2.486 ms | 0.6457 ms | 3 |
performUsingOneCycle| 100000 | 100 | 5.789 ms | 4.384 ms | 1.1387 ms | 1 |
performUsingLINQ | 100000 | 1000 | 27.998 ms | 2.094 ms | 0.5439 ms | 4 |
performUsingOneCycle | 100000 | 1000 | 6.645 ms | 4.694 ms | 1.2193 ms | 1 |
performUsingLINQ | 100000 | 10000 | 78.585 ms | 5.072 ms | 1.3175 ms | 5 |
performUsingOneCycle| 100000 | 10000 | 11.994 ms | 8.442 ms | 2.1927 ms | 2 |
performUsingLINQ | 1000000 | 10 | 206.446 ms | 13.331 ms | 3.4626 ms | 7 |
performUsingOneCycle| 1000000 | 10 | 65.255 ms | 50.348 ms | 13.0776 ms | 5 |
performUsingLINQ | 1000000 | 100 | 244.823 ms | 57.552 ms | 14.9488 ms | 8 |
performUsingOneCycle| 1000000 | 100 | 55.222 ms | 36.442 ms | 9.4656 ms | 5 |
performUsingLINQ | 1000000 | 1000 | 318.040 ms | 20.250 ms | 5.2598 ms | 9 |
performUsingOneCycle| 1000000 | 1000 | 68.306 ms | 44.328 ms | 11.5140 ms | 5 |
performUsingLINQ | 1000000 | 10000 | 632.400 ms | 109.849 ms | 28.5328 ms | 10 |
performUsingOneCycle| 1000000 | 10000 | 100.853 ms | 41.869 ms | 10.8753 ms | 6 |


Как видно из таблицы, правильный алгоритм (как в примере Панфилова - когда хешмапа создается один раз в самом начале) будет где-то в 6 раз быстрее чем LINQ с джойнами. Код TC с вложенными итерациями, приведенный в начале темы будет в сотни раз медленнее.
...
Рейтинг: 0 / 0
Преобразование вложенных циклов в Java 8 stream
    #39710989
Nebo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
KopranychАндрей Панфилов,
Спасибо за решение!
А еще говорят, что функциональное программирование более проще читается, по мне так мой вариант в обычном стиле более проще в понимании

Во всём нужны мера. Где-то одно хорошо, где-то другое.
...
Рейтинг: 0 / 0
Преобразование вложенных циклов в Java 8 stream
    #39710991
Nebo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
28 сообщений из 28, показаны все 2 страниц
Форумы / Java [игнор отключен] [закрыт для гостей] / Преобразование вложенных циклов в Java 8 stream
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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