第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

封閉范圍內(nèi)的局部變量具有不同的結(jié)果

封閉范圍內(nèi)的局部變量具有不同的結(jié)果

郎朗坤 2023-07-28 16:12:26
比較用于將雙精度數(shù)添加到雙精度數(shù)的兩個(gè)運(yùn)算符類型:DoubleUnaryOperator和UnaryOperator<Double>:    public void test() {        double doub = 10.0;        // This is OK        DoubleUnaryOperator oo = d -> {            return doub + d;        };                  // Compilation error: Local variable doub defined in an enclosing scope must be final or effectively final        UnaryOperator<Double> o = d -> {            return doub + d;         };        doub = oo.applyAsDouble(.3);        doub = o.apply(.3);    }  為什么只有UnaryOperator<Double>才會(huì)出現(xiàn)編譯錯(cuò)誤(doub不是最終的)?如果變量聲明從未改變,為什么會(huì)出現(xiàn)不同的結(jié)果?
查看完整描述

2 回答

?
www說(shuō)

TA貢獻(xiàn)1775條經(jīng)驗(yàn) 獲得超8個(gè)贊

就我而言(Java12),我在 和 中都遇到了DoubleUnaryOperator錯(cuò)誤UnaryOperator。

您的情況是,您正在重新分配doubwithoo函數(shù)結(jié)果,然后嘗試使用doubin 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)


查看完整回答
反對(duì) 回復(fù) 2023-07-28
?
12345678_0001

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 中編譯:

https://img1.sycdn.imooc.com//64c378a000015a8606560503.jpg

然而,doub通過(guò)分配 to 來(lái)有效地實(shí)現(xiàn)最終result允許代碼編譯: 

https://img1.sycdn.imooc.com//64c378b4000181ac06530555.jpg

查看完整回答
反對(duì) 回復(fù) 2023-07-28
  • 2 回答
  • 0 關(guān)注
  • 136 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)