【问题标题】:Running a lambda in a loop在循环中运行 lambda
【发布时间】:2018-07-24 04:20:59
【问题描述】:

我通过提供Instant 的时间来创建一个事件。

serviceContainer.consumeEvent(event ->
        event.setPayload(new TriggerCalculation(Instant.ofEpochMilli(serviceContainer.currentTimeMillis())
)));

但是,我想为Instant 添加一个固定的时间间隔,并使用新的Instant 创建一个新事件。

serviceContainer.consumeEvent(event ->
        event.setPayload(new TriggerCalculation(Instant.ofEpochMilli(serviceContainer.currentTimeMillis()).plus(1, ChronoUnit.DAYS)
        )));

但是,我不能在 for 循环中执行此操作,因为索引 i 必须是最终的:

for(int i=1; i<7; i++){
    serviceContainer.consumeEvent(event ->
            event.setPayload(new TriggerCalculation(Instant.ofEpochMilli(serviceContainer.currentTimeMillis()).plus(i, ChronoUnit.DAYS)
            )));

}

如果我想在 lambda 中增加一个值,如何在 java 中循环一个 lambda?

【问题讨论】:

  • i 分配给前一行中的另一个变量,并在 lambda 中使用它。
  • 你可以在 lambda 之外创建一个最终的TriggerCalculation

标签: java lambda


【解决方案1】:

您可以为此使用IntStream.range

IntStream.range(0, 7)
            .forEach(i -> serviceContainer.consumeEvent(event ->
                    event.setPayload(new TriggerCalculation(Instant.ofEpochMilli(serviceContainer.currentTimeMillis()).plus(i, ChronoUnit.DAYS)
                    ))));

【讨论】:

    【解决方案2】:

    将整数移出 lambda

    for(int i=1; i<7; i++){
        final TriggerCalculation tc = new TriggerCalculation(Instant.ofEpochMilli(serviceContainer.currentTimeMillis()).plus(i, ChronoUnit.DAYS));
        serviceContainer.consumeEvent(event -> event.setPayload(tc));
    }
    

    【讨论】:

      【解决方案3】:

      你可以这样做:

      for(int i=1; i<7; i++){
          final int newI = i;
          serviceContainer.consumeEvent(event ->
                  event.setPayload(new TriggerCalculation(Instant.ofEpochMilli(serviceContainer.currentTimeMillis()).plus(newI, ChronoUnit.DAYS)
                  )));
      
      }
      

      或者这个:

      IntStream.range(0, 7)
          .mapToObj(x -> Instant.ofEpochMilli(serviceContainer.currentTimeMillis()).plus(x, ChronoUnit.DAYS))
          .map(TriggerCalculation::new)
          .forEach(x -> {
              serviceContainer.consumeEvent(event ->
                  event.setPayload(x));
          });
      

      【讨论】:

      • 下面建议的IntStream.range 不是首选有什么原因吗?
      • @SSF 你可以争辩说流有一些开销,但不使用它们可能是一个微优化。
      猜你喜欢
      • 2021-11-26
      • 1970-01-01
      • 1970-01-01
      • 2021-05-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-01
      • 1970-01-01
      相关资源
      最近更新 更多