Это просто нечто. Очень редко случается найти спикера, которого просто взахлеб слушаешь. Жалко, что Тагир не в мире веб-разработки. Очень бы хотел послушать от него про спринг, хибер, паттерны и лучшие практики во всем этом, как он рассказывает про Java Core.
Параллельные стримы не стоит использовать по умолчанию, из-за накладных расходов на распараллеливание до, слияние после и управление потоками и дополнительной памятью в процессе. Например на сотне элементов параллельные стримы могут работать в тысячи раз медленнее, чем обычные. Стоит распараллеливать, если объём данных ожидается большой, и, что важнее, если вы понимаете, что это узкое место, вы провели тесты, и выяснилось, что параллельные стримы работают лучше. Нет универсального и одновременно точного способа теоретически понять, когда распараллеливание показывает выгоду, поэтому лучше проверять
Без промежуточного итога не получилось решить, только если добавить промежуточный класс public record UserDepartment(User user, Department department) { }; То решение такое: private Map getUserChiefs(Company company) { Stream userDepartments = company.departments .flatMap(d -> d.users.map((u -> new UserDepartment(u, d)))); return userDepartments .collect(groupingBy(ud -> ud.user, mapping(ud -> ud.department.chief, toList()) )); }
ну и такой тест прогнал для наглядности @Test public void test() { //map key - is user - worker //map - value list of chiefs User denis = new User("Denis"); User jack = new User("Jack"); User john = new User("John"); User bob = new User("Bob"); User ivan = new User("Ivan"); Department itDepartment = new Department("IT", john, Stream.of(denis, jack, bob)); Department accountingDepartment = new Department("Accounting", ivan, Stream.of(jack, bob)); Company megaIndustrials = new Company(Stream.of(itDepartment, accountingDepartment)); Map userChiefs = getUserChiefs(megaIndustrials); assertTrue(userChiefs.containsKey(jack)); assertEquals(2, userChiefs.get(jack).size()); assertEquals(2, userChiefs.get(bob).size()); assertTrue(userChiefs.get(jack).containsAll(List.of(john, ivan))); assertTrue(userChiefs.get(bob).containsAll(List.of(john, ivan))); assertEquals(1, userChiefs.get(denis).size()); assertTrue(userChiefs.get(denis).contains(john)); }
@@MaksimWojtk я вот так сделал через группировку: company.departments().stream() .flatMap(d -> d.users() .map(u -> new AbstractMap.SimpleEntry(u, d.chief()) {})) .collect(groupingBy(AbstractMap.SimpleEntry::getKey, mapping(AbstractMap.SimpleEntry::getValue, toList()))) Но идею с парой использовал вашу. Не знаю, возможно ли как-то проще.
Это просто нечто. Очень редко случается найти спикера, которого просто взахлеб слушаешь. Жалко, что Тагир не в мире веб-разработки. Очень бы хотел послушать от него про спринг, хибер, паттерны и лучшие практики во всем этом, как он рассказывает про Java Core.
Спасибо большое Тагиру и учебному центру за то, что вот так бескорыстно предоставляете доступ к своим лекциям!
Очень познавательно. Чем больше смотрю про Stream API, тем больше нового узнаю. Полезно знать про реализацию в разных версиях Java.
Коллекторы - восхитительны!
Тагир - великолепен!
Спасибо за курс!
Думаю было бы хорошим тоном ссылки из видео дублировать в описании. ))
7:25 "в этом месте мы начинаем спускать в ад" - в голосину😂😂😂
Тоже проорал)
Спасибо, Тагир! Разжевал)
Тагир крутой.
Тагир лучший!
В лекции почти не коснулись параллельных стримов.
Почему не стоит использовать параллельные стримы по умолчанию?
Параллельные стримы не стоит использовать по умолчанию, из-за накладных расходов на распараллеливание до, слияние после и управление потоками и дополнительной памятью в процессе. Например на сотне элементов параллельные стримы могут работать в тысячи раз медленнее, чем обычные. Стоит распараллеливать, если объём данных ожидается большой, и, что важнее, если вы понимаете, что это узкое место, вы провели тесты, и выяснилось, что параллельные стримы работают лучше. Нет универсального и одновременно точного способа теоретически понять, когда распараллеливание показывает выгоду, поэтому лучше проверять
кто - нибудь решил упражнение с 54:25 ?
Я пытаюсь сижу, пока не получилось. А ты решил?
@@anastasiya_pesto неа , просто , кажется , как будто и невозможно
Без промежуточного итога не получилось решить, только если добавить промежуточный класс
public record UserDepartment(User user, Department department) {
};
То решение такое:
private Map getUserChiefs(Company company) {
Stream userDepartments = company.departments
.flatMap(d -> d.users.map((u -> new UserDepartment(u, d))));
return userDepartments
.collect(groupingBy(ud -> ud.user,
mapping(ud -> ud.department.chief, toList())
));
}
ну и такой тест прогнал для наглядности
@Test
public void test() {
//map key - is user - worker
//map - value list of chiefs
User denis = new User("Denis");
User jack = new User("Jack");
User john = new User("John");
User bob = new User("Bob");
User ivan = new User("Ivan");
Department itDepartment = new Department("IT", john, Stream.of(denis, jack, bob));
Department accountingDepartment = new Department("Accounting", ivan, Stream.of(jack, bob));
Company megaIndustrials = new Company(Stream.of(itDepartment, accountingDepartment));
Map userChiefs = getUserChiefs(megaIndustrials);
assertTrue(userChiefs.containsKey(jack));
assertEquals(2, userChiefs.get(jack).size());
assertEquals(2, userChiefs.get(bob).size());
assertTrue(userChiefs.get(jack).containsAll(List.of(john, ivan)));
assertTrue(userChiefs.get(bob).containsAll(List.of(john, ivan)));
assertEquals(1, userChiefs.get(denis).size());
assertTrue(userChiefs.get(denis).contains(john));
}
@@MaksimWojtk я вот так сделал через группировку:
company.departments().stream()
.flatMap(d -> d.users()
.map(u -> new AbstractMap.SimpleEntry(u, d.chief()) {}))
.collect(groupingBy(AbstractMap.SimpleEntry::getKey,
mapping(AbstractMap.SimpleEntry::getValue, toList())))
Но идею с парой использовал вашу. Не знаю, возможно ли как-то проще.
на втором часе мозг закипел... тяжеловато.