【问题标题】:Calling a Java 8 function only once when iterating a function list迭代函数列表时仅调用一次 Java 8 函数
【发布时间】:2016-10-14 08:19:39
【问题描述】:

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

@Autowired
private List<Function<String, String>> evaluators; 
//...
private String evaluate(String code) {  
    return evaluators.stream().filter(f -> f.apply(code) != null).findFirst().get().apply(code); 
}

【问题讨论】:

  • 但是如果你用不同的code调用方法,你会期待不同的结果,对吧?所以你想要一个代码缓存到应用函数的结果?
  • 没有内置任何东西。这个概念被称为“记忆化”,所以试着用谷歌搜索一下。一般的方法是用记忆层包装你的 lambda 实例。
  • @Joop Eggen:过度lambda化的典型案例,使用function::applyFunction转换为Function。除此之外,那篇文章中的“基准”是荒谬的。
  • @Joop Eggen:它没有被称为基准测试,但是在 JVM 中测量相同函数的后续执行时间几乎总是会为第二次执行产生更短的执行时间,无论是否记忆化。所以测量和打印这些时间是没有意义的。

标签: java function lambda java-8


【解决方案1】:

试试这个。

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

【讨论】:

  • 等等,这是问题吗?我认为 OP 想要 to cache 将函数应用于给定代码的结果?如果您使用相同的代码调用evaluate,这仍将调用函数。
  • @Tunaki:这个答案确定了问题的 xy 问题。原始流代码不必要地调用相同的函数两次。解决这个问题就不需要缓存结果了。
  • @saka1029:测试显示在调用evaluators 列表中的函数时表现出非贪婪的方式。极好的! :)
猜你喜欢
  • 2021-03-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-25
  • 2017-06-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多