Если у меня есть функция f
в OCaml, я могу просто набрать
let f x = if x=1 then 42 else f x
Если это не скроет старое определение f
, это будет именно то, что я хотел бы.Теперь я ищу эквивалент в Java, но с дополнительным ограничением, что ссылка в Function f
обновляется .Я могу создать Function
-объект
Function<Integer, Integer> f = new Function<>() {
@Override
public Integer apply(Integer integer) {
return integer+1;
}
};;
И теперь можно определить новый Function
через
Function<Integer, Integer> g = new Function<>() {
@Override
public Integer apply(Integer integer) {
if (integer==1)
return 42;
else
return f.apply(integer);
}
};;
Однако это работает, только если объявлен f
final
или эффективно final
.Таким образом, я не могу изменить ссылку с помощью f = g;
.Что я могу сделать?
РЕДАКТИРОВАТЬ : Чтобы уточнить, я должен установить f
так, чтобы он ссылался на Function
, который использует старый Function f
как это было указано ранее.Нужный код будет выглядеть примерно так:
while(f.apply(i) != 0){
//as above:
g = ... //should use "the newest" f
f = g; //should be used next iteration
//then:
.... //some other code
i = ...;
}