2014-12-02 49 views
0

在由Venkat廉在Java书函数式编程中,作者日期为我们提供了完美的作品一memoizer的例子,接下来我离开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); 
    } 
} 

所以这里是我的问题,不会在每次调用方法callMemoizer时创建函数memoized?我假设不是因为其他方式的HashMap存储将不会存储所有的值... 请有人向我解释如何以及为什么那段代码工作...

回答

0

本地变量Function<T,R> memoized = new Function<T,R>()将被创建每次调用callMemoizer。但重要的一点是,昂贵的计算和与关键的关联只会发生一次(假设你的地图不弱/软),通过computeIfAbsent

-1

谢谢埃米尔,你是正确的局部变量功能memoized = new Function( )将在每次调用callMemoizer时创建,所以当然每次调用callMemoizer时都会创建HashMap存储......我想我的疑惑出现了,因为我没有完全理解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的将被创建了一次,那么递归将使用apply方法,这样所有的值都将被正确地存储在散列映射中......