簡體   English   中英

如何在 Java 8 Lambdas 中使用非最終變量

[英]How to use non final variable in Java 8 Lambdas

如何在 Java 8 lambda 中使用非最終變量。 它拋出編譯錯誤,說“在封閉范圍中定義的局部變量日期必須是最終的或有效的最終”

我實際上想實現以下目標

public Integer getTotal(Date date1, Date date2) {
    if(date2 == null || a few more conditions) {
        date2 = someOtherDate;
    }
    return someList.stream().filter(filter based on date1 and date2).map(Mapping Function).reduce(Addition);
}

我如何實現這一目標? 它引發 date2 的編譯錯誤。 謝謝,

使用另一個可以啟動一次的變量。

final Date tmpDate;
if(date2 == null || a few more conditions) {
    tmpDate = someOtherDate;
} else {
    tmpDate = date2;
}

這應該會有所幫助。

public Long getTotal(Date date1, Date date2) {
    final AtomicReference<Date> date3 = new AtomicReference<>();
    if(date2 == null ) {
        date3.getAndSet(Calendar.getInstance().getTime());
    }
    return someList.stream().filter(x -> date1.equals(date3.get())).count();
}

我認為你應該在外面獲取參數 date2 然后調用方法 getTotal,就像下面這樣:

Date date1;
Date date2;

if(date2 == null || a few more conditions) {
   date2 = someOtherDate;
}

getTotal(date1, date2)


public Integer getTotal(Date date1, Date date2) {
    return someList.stream().filter(filter based on date1 and date2).map(Mapping Function).reduce(Addition);
}

只需添加一行

Date date3 = date2; // date3 is effectively final in Java 8. Add 'final' keyword in Java 7.

就在您的 lambda 之前,並使用date3代替date2

使用日期數組在 lambda 中使用

public Integer getTotal(Date date1, Date date2) {
  Date[] date = {date2 == null || a few more conditions ? someOtherDate : date2};
  return someList.stream().filter(filter based on date[0]).map(Mapping Function).reduce(Addition);
}

與非數組解決方案相比, date[0]甚至可以在非並行流中更改。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM