Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/322.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
迭代函数列表时只调用一次Java8函数_Java_Function_Lambda_Java 8 - Fatal编程技术网

迭代函数列表时只调用一次Java8函数

迭代函数列表时只调用一次Java8函数,java,function,lambda,java-8,Java,Function,Lambda,Java 8,是否有一种优雅的方法来存储apply()方法的返回值,这样就不必多次调用它?因为我能想到的唯一方法是创建一个局部映射变量来存储函数-“返回值”对 @Autowired 私人名单评价员; //... 私有字符串求值(字符串代码){ 返回计算器.stream().filter(f->f.apply(code)!=null.findFirst().get().apply(code); } 试试这个 private String evaluate(String code) { ret

是否有一种优雅的方法来存储
apply()
方法的返回值,这样就不必多次调用它?因为我能想到的唯一方法是创建一个局部映射变量来存储函数-“返回值”对

@Autowired
私人名单评价员;
//...
私有字符串求值(字符串代码){
返回计算器.stream().filter(f->f.apply(code)!=null.findFirst().get().apply(code);
}
试试这个

  private String evaluate(String code) {  
      return evaluators.stream()
          .map(f -> f.apply(code))
          .filter(s -> s != null)
          .findFirst().get();
  }

但是如果你用不同的
代码调用这个方法,你会期望不同的结果,对吗?所以你想在应用函数的结果中缓存代码?没有内置内容。这个概念被称为“记忆化”,所以试着用谷歌搜索一下。一般的方法是用一个记忆层包装lambda实例。在这里寻找一个记忆器类@Joop Eggen:over lambdiation的典型案例,使用
function::apply
函数
转换为
函数
。除此之外,那篇文章中的“基准测试”是荒谬的。@Joop Eggen:它没有被称为基准测试,但测量JVM中同一函数的后续执行时间几乎总是会为第二次执行(无论是否进行记忆化)产生更短的执行时间。所以测量和打印这些时间没有意义。等等,这是问题吗?我以为OP想要对给定代码应用函数的结果?如果您使用相同的代码调用
evaluate
,这仍然会调用函数。@Tunaki:这个答案确定了问题的xy问题。原始流代码不必要地调用同一函数两次。解决了这个问题,就不需要缓存结果了。@saka1029:测试显示在调用
求值器
列表中的函数时采用了非贪婪的方式。太棒了!:)
  private String evaluate(String code) {  
      return evaluators.stream()
          .map(f -> f.apply(code))
          .filter(s -> s != null)
          .findFirst().get();
  }