2 回答

TA貢獻(xiàn)1775條經(jīng)驗(yàn) 獲得超8個(gè)贊
就我而言(Java12),我在 和 中都遇到了DoubleUnaryOperator
錯(cuò)誤UnaryOperator
。
您的情況是,您正在重新分配doub
withoo
函數(shù)結(jié)果,然后嘗試使用doub
in next 運(yùn)算符。
我引用的是:最終和有效最終之間的區(qū)別
通俗地說(shuō),如果局部變量的初始值從未改變,那么它實(shí)際上就是final的——換句話說(shuō),將其聲明為final不會(huì)導(dǎo)致編譯失敗。
所以,經(jīng)過(guò)檢查我明白的是:
如果變量是final
,則它始終可以在 lambda 表達(dá)式中使用,因?yàn)椴豢赡苤匦路峙渌ㄓ?- 反射,但這是另一個(gè)主題)。
effectively final
當(dāng)聲明的變量保持不變時(shí),該變量就會(huì)出現(xiàn)。
如果您將 的結(jié)果分配oo
給新聲明的變量,那么您應(yīng)該能夠在o
.
我相信您試圖實(shí)現(xiàn)10.6
價(jià)值,示例如下:
double doub = 10.0;
DoubleUnaryOperator oo = d -> {
? ? return doub + d;
};
double ahh = oo.applyAsDouble(.3);
UnaryOperator<Double> o = d -> {
? ? return ahh + d;
};
System.out.println(o.apply(.3)); //The o.apply(.3) can be assigned to new variable?
任何重新分配doub或ahh導(dǎo)致編譯錯(cuò)誤 (Java11)

TA貢獻(xiàn)1802條經(jīng)驗(yàn) 獲得超5個(gè)贊
我無(wú)法重現(xiàn)您的聲明,即一個(gè)編譯而另一個(gè)不編譯。對(duì)我來(lái)說(shuō),兩者都不能編譯。
信息:java:編譯模塊“tuts”時(shí)發(fā)生錯(cuò)誤信息:javac 1.8.0_192用于編譯java源信息:9/14/2019 8:10 PM - 構(gòu)建完成,2秒849毫秒C內(nèi)有1個(gè)錯(cuò)誤和0個(gè)警告:\Users\Philip\Code\tuts\src\test\java\tuts\UnaryOperatorTest.java 錯(cuò)誤:(13, 60) java: 從 lambda 表達(dá)式引用的局部變量必須是最終的或有效的最終
doub
問(wèn)題是,在使用 的 lambda 中創(chuàng)建新作用域后,您嘗試在外部作用域中重新分配 to doub
。
doub
如果您可以在 lambda 范圍之外更改 的值,則 lambda 的功能將變得不確定。因此,來(lái)自外部作用域的值必須被聲明final
或者是“有效”最終的(意味著您遵循規(guī)則并且不要嘗試在外部作用域中重新分配給它們)。
如果您只需將結(jié)果分配給不同的變量(result
,在下面的示例中),您就可以使用兩種替代方案:
import org.junit.Assert;
import org.junit.Test;
import java.util.function.DoubleUnaryOperator;
import java.util.function.UnaryOperator;
public class UnaryOperatorTest {
@Test
public void testDoubleUnaryOperator() {
double doub = 10.0;
DoubleUnaryOperator doubleUnaryOperator = d -> d + doub;
double result = doubleUnaryOperator.applyAsDouble(0.3);
Assert.assertEquals(10.3, result, Double.MIN_VALUE);
}
@Test
public void testUnaryOperator() {
double doub = 10.0;
UnaryOperator<Double> unaryOperator = d -> d + doub;
double result = unaryOperator.apply(0.3);
Assert.assertEquals(10.3, result, Double.MIN_VALUE);
}
}
(編輯)我已逐字復(fù)制并粘貼您的代碼。FunctionalInterface
從有問(wèn)題的行號(hào)(31 和 36)可以看出,這兩個(gè)示例 都無(wú)法在 Java 8 中編譯:
然而,doub
通過(guò)分配 to 來(lái)有效地實(shí)現(xiàn)最終result
允許代碼編譯:
添加回答
舉報(bào)