Информация об изменениях

Сообщение Re: Лямбда с побочным эффектом от 09.05.2020 16:07

Изменено 09.05.2020 16:14 GarryIV

Re: Лямбда с побочным эффектом
Здравствуйте, f95.2, Вы писали:

F2>Насколько я знаю, в java нет методаожидания с предикатом, аналога std::condition_variable::wait из c++.


F2>Допустим, я написал такой метсод с сигнатурой:

F2>
F2>public void TimedWait(Object monitor, long timeout_msec, BooleanSupplier condition);
F2>

С большой буквы имя класса пишется, имя метода с маленькой.

F2>TimedWait(monitor, timeout_msec, () -> {

F2> wrapper[0] = calculateValue();
F2> return !wrapper[0].equals(ифвValue);
F2>});
F2>[/java]

F2>Мб есть какой-то красивый и идиоматичный способ решить подобную проблему.

F2>Или вообще отказаться от лямбды с побочным эффектом, а сделать как-то еще?

Пусть TimedWait возвращает значение. Зачем эти грязные функции на ровном месте? И кондишн у тебя вот ни разу не кондишн а 2 в 1, ValueSupplier + ValuePredicаte. Это можно причесать если лямбду сделать типа () -> Optional<T>.

Типа так
<T> T timedWait(Object monitor, int timeoutMsec, Supplier<Optional<T>> supplier) {
...
}


Использовать так:
ValueType value = timedWait(monitor, timeoutMsec, () -> Optional.of(calculateValue()).filter(it -> !it.equals(badValue)));


Или сделать 2 отдельных параметра
Re: Лямбда с побочным эффектом
Здравствуйте, f95.2, Вы писали:

F2>Насколько я знаю, в java нет методаожидания с предикатом, аналога std::condition_variable::wait из c++.


F2>Допустим, я написал такой метсод с сигнатурой:

F2>
F2>public void TimedWait(Object monitor, long timeout_msec, BooleanSupplier condition);
F2>

С большой буквы имя класса пишется, имя метода с маленькой.

F2>TimedWait(monitor, timeout_msec, () -> {

F2> wrapper[0] = calculateValue();
F2> return !wrapper[0].equals(ифвValue);
F2>});
F2>[/java]

F2>Мб есть какой-то красивый и идиоматичный способ решить подобную проблему.

F2>Или вообще отказаться от лямбды с побочным эффектом, а сделать как-то еще?

Пусть TimedWait возвращает значение. Зачем эти грязные функции на ровном месте? И кондишн у тебя вот ни разу не кондишн а 2 в 1, ValueSupplier + ValuePredicаte. Это можно причесать если лямбду сделать типа () -> Optional<T>.

Типа так
<T> T timedWait(Object monitor, int timeoutMsec, Supplier<Optional<T>> supplier) {
...
}


Использовать так:
ValueType value = timedWait(monitor, timeoutMsec, () -> Optional.of(calculateValue()).filter(it -> !it.equals(badValue)));


Или сделать 2 отдельных параметра.

PS A вообще я бы прикрутил CompletableFuture раз там у тебя многопоточность какая-то. Чтоб calculateValue прямо ее и возвращал.