Я недавно столкнулся с конкурентным ответом лучше моего, который использует совершенно новый метод, называемый мне как замена лямбды.
Stream.generate(new AtomicInteger(1)::getAndIncrement)...
Я посмотрел Оракулспецификации на ссылки на метод и определены 4 типа:
- ссылка на статический метод
ContainingClass::staticMethodName
- ссылка на метод экземпляра определенного объекта
containingObject::instanceMethodName
- Ссылка на метод экземпляра произвольного объекта определенного типа
ContainingType::methodName
- Ссылка на конструктор
ClassName::new
Я борюсь склассифицировать этот.Я не нашел ни одного вопроса по SO или чего-либо соответствующего, объясненного в документах.Как бы это перевести в анонимный класс?
Мое подозрение:
IntStream.generate(new IntSupplier() {
AtomicInteger atom = new AtomicInteger(1);
@Override
public int getAsInt() {
return atom.getAndIncrement();
}
})....
... Я не понимаю, как это возможно.На первый взгляд, я думаю, это выражение:
IntStream.generate(new IntSupplier() {
@Override
public int getAsInt() {
return new AtomicInteger(1).getAndIncrement();
}
})....
... но это не что иное, как () -> new AtomicInteger(1).getAndIncrement()
.
Где определяется этот вид выражения и как он будет точно переписан в лямбда / анонимном классе?