迭代函数列表时只调用一次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();
}