Size: a a a

2021 February 25

ВА

Ветеран Андреич... in pro.jvm
Привет! Можете подсказать? Есть метод collect с такой сигнатурой. Я его вызываю так. Но можно вызвать и так. Почему второй вариант работает?

1. <R> R collect(Supplier<R> var1, ObjLongConsumer<R> var2, BiConsumer<R, R> var3);
2. .collect(HashSet::new, (set, e) -> set.add(e), HashSet::addAll)
3. .collect(HashSet::new, HashSet::add, HashSet::addAll)
источник

ВА

Ветеран Андреич... in pro.jvm
ObjLongConsumer это функциональный интерфейс, сигнатура которого void accept(T var1, long var2);
источник

ВА

Ветеран Андреич... in pro.jvm
Ветеран Андреич
Привет! Можете подсказать? Есть метод collect с такой сигнатурой. Я его вызываю так. Но можно вызвать и так. Почему второй вариант работает?

1. <R> R collect(Supplier<R> var1, ObjLongConsumer<R> var2, BiConsumer<R, R> var3);
2. .collect(HashSet::new, (set, e) -> set.add(e), HashSet::addAll)
3. .collect(HashSet::new, HashSet::add, HashSet::addAll)
В пункте 3 я бы ожидал non-static method cannot be referenced from static context, но почему-то все работает
источник

GM

Gerr Mes in pro.jvm
Sergey Potekhin
кому-нибудь доводилось запускать parallelStream внутри блока synchronized? Это должно работать?
должно, но если задаться целью можно сделать так что fork/join заблочится весь - на чем у вас synchronized?
источник

SP

Sergey Potekhin in pro.jvm
на локальной переменной  типа Object
источник

GM

Gerr Mes in pro.jvm
внутри пайплайна стрима вы на ней тоже synchronized делаете?
источник

SP

Sergey Potekhin in pro.jvm
нет
источник

GM

Gerr Mes in pro.jvm
тогда все норм будет
источник

SP

Sergey Potekhin in pro.jvm
ок спасибо
источник

AG

Alexey Genus in pro.jvm
Ветеран Андреич
Привет! Можете подсказать? Есть метод collect с такой сигнатурой. Я его вызываю так. Но можно вызвать и так. Почему второй вариант работает?

1. <R> R collect(Supplier<R> var1, ObjLongConsumer<R> var2, BiConsumer<R, R> var3);
2. .collect(HashSet::new, (set, e) -> set.add(e), HashSet::addAll)
3. .collect(HashSet::new, HashSet::add, HashSet::addAll)
У меня оба варианта работают. Наверное, это зависит от того, что там реально вызывается. А есть полный пример кода?
источник

ВА

Ветеран Андреич... in pro.jvm
Alexey Genus
У меня оба варианта работают. Наверное, это зависит от того, что там реально вызывается. А есть полный пример кода?
Set<Long> testSet = new Random().longs(100, 1000000000L, 999999999999L).collect(HashSet::new, HashSet::add, HashSet::addAll);
источник

AG

Alexey Genus in pro.jvm
У меня реально компилируются оба варианта)
источник

AG

Alexey Genus in pro.jvm
источник

ВА

Ветеран Андреич... in pro.jvm
Ветеран Андреич
Set<Long> testSet = new Random().longs(100, 1000000000L, 999999999999L).collect(HashSet::new, HashSet::add, HashSet::addAll);
да, у меня тоже. Вопрос в том почему этот вариант работает
источник

AG

Alexey Genus in pro.jvm
Аааа, я-то думал в другом вопрос)
источник

ВА

Ветеран Андреич... in pro.jvm
HashSet::add, я бы ожидал увидеть non-static method with static сontext
источник

ВА

Ветеран Андреич... in pro.jvm
Или тут какой-то сахар запрятан с тем, что HashSet::add кастится к ObjLongConsumet<T>, где T будет HashSet<Long>, а второй аргумент и там и там лонг?
источник

AG

Alexey Genus in pro.jvm
Да, согласен, неочевидно. Но, видимо, можно однозначно привести тип референса к требуемому
источник

AS

Aleksey Shipilev in pro.jvm
В JLS 15.13.1 "Compile-Time Declaration of a Method Reference" это показано. Если нет неоднозначностей, то ресивер выступает в качестве первого аргумента
источник

AS

Aleksey Shipilev in pro.jvm
"In the first search, the method reference is treated as if it were an invocation with argument expressions of types P1 , ..., Pn;  [...]

In the second search, if P1 , ..., Pn is not empty and P1 is a subtype of ReferenceType, then the method reference expression is treated as if it were a method invocation  expression with argument expressions of types P2, ..., Pn. [...]

If the first search produces a static method, and no non- static method is applicable [...] during the second search, then the compile-time declaration is the result of the first search.

Otherwise, if no static method is applicable [...] during the first search, and the second search produces a non-static method, then the compile-time declaration is the result of the second search."
источник