2014-12-02 1 views
0

В книге функционального программирования в Java с помощью Venkat Субраманиам, то Автор дает нам пример memoizer, который прекрасно работает, рядом я оставить реализацию класса memoizer:Функциональное программирование в Java Venkat Субраманиам memoizer

public class Memoizer { 
    public static <T,R> R callMemoizer(final BiFunction< Function<T,R>,T,R> function, final T input){ 
     Function<T,R> memoized = new Function<T,R>(){ 
      HashMap<T,R> store = new HashMap<>(); 
      @Override 
      public R apply(T input) { 
       return store.computeIfAbsent(input, key -> function.apply(this, key)); 
      } 
     }; 
     return memoized.apply(input); 
    } 
} 

Итак, вот мой вопрос, не будет ли функция memoized создаваться в каждом вызове метода callMemoizer? я предполагаю, что не потому, что другие способы хранения HashMap не будут хранить все значения ... пожалуйста, объясните мне, как и почему этот фрагмент кода работает ...

ответ

0

Локальная переменная Function<T,R> memoized = new Function<T,R>() будет создаваться каждый раз Вызывается callMemoizer. Важным моментом является то, что дорогой расчет и связь с ключом произойдет только один раз (при условии, что ваша карта не слабая/мягкая) через computeIfAbsent

-1

Спасибо Амир, вы правы локальной переменной Функция memoized = new Функция () будет создаваться каждый раз, когда вызывается callMemoizer, поэтому, конечно, хранилище HashMap будет создано каждый раз, когда вызывается callMemoizer ... Я думаю, что мое сомнение возникло из-за того, что я не совсем понял, как использовался Memoizer, поэтому следующий я ухожу использование callMemoizer в примере:

public static int maxProfit(final int length){ 
    return Memoizer.callMemoizer((func,size) ->{ 
      int profit = (size <= prices.size()) ? prices.get(size-1) : 0; 
      for(int i=1; i<size; ++i){ 
       int priceWhenCut = func.apply(i)+func.apply(size-i); 
       if(profit < priceWhenCut) profit = priceWhenCut; 
      } 
      return profit; 
     } 
     , length 
    ); 
} 

код на самом деле работает, потому что callMemoizer будет называться только один раз и HashMap будет создан только один раз для эв ey, тогда рекурсия будет использовать метод apply, поэтому все значения будут правильно сохранены в hashmap ....

 Смежные вопросы

  • Нет связанных вопросов^_^