JAVA OCP 1Z0819 認證 模擬試題解析 Lesson17-5 技術觀念題型總講解

皇阿瑪數位學院
6 位粉絲
5 觀看·2025年1月1日
大家好,我是黃馬老師
我們繼續來看一下考題,事實題
事實題它說
Which statement is equivalent to line 1?
就是說下列哪個敘述啦
等同於這一行,line 1 這一行
那還沒有解題前
這一題考了一些functional interface
還有一些方法的運用
那還沒有解題前
我們先把這個關鍵的函數式介面
還有一些相關的方法
我先講解一下
那講解好了
到時候我們再回過頭來看考題
各位應該就會比較駕輕就熟
來,首先它最主要就是在考String這個資料流
那String這個資料流
它考的是在這個String介面的一些方法
那第一個我們要考慮的是
它有一個這個叫reduce的方法
那reduce就是在做一些總結、歸納
那reduce這個方法
各位要特別特別的注意
當它reduce裡面放的是一個參數
它reduce假如說放的是一個參數
那這個參數是binary operator
事實上binary就稱為二元
那operator運算值
以前我們在講operator運算值的時候
有分成unary、binary、ternary
一元運算值、二元運算值、三元運算值
那它這一個functional interface
這個函數式介面
它真的就叫binary operator
二元運算值
可是它不是在做那個什麼加減乘除
這樣的二元運算值
它是一個functional interface
等於是它繼承了這個by function
那by function就是要兩個輸入一個輸出
到時候呼叫它的那個apply抽象方法的時候
就是行參有兩個
而return有一個
這個就叫binary operator
那事實上它繼承了這個叫by function
這一個函數式介面
那你如果是unary operator
這一個函數式介面的話
它繼承的就是function
啊function就一進一出嘛
好那再回到剛才講的重點
reduce如果丟的是一個參數
丟的是一個參數
它return是一個optional的列別
這要記
啊reduce如果丟了兩個參數
一個就是你的那個identity
等於是說你現在要從哪裡開始去做加總
要從0還是10
ok或者是100
如果10就加10
100就加100
那今天假如說reduce丟的是兩個的話
它return的
return的就是看你是什麼樣的資料型態
return的就是資料型態
那記得
一個它是optional
啊兩個
reduce這個方法
丟的是兩個行參的話
它的return就不是optional類了
而是相關的
而是這個相關的資料類型
ok好這是第一個要記得的
那再來
這個不管是mapToDouble
或者mapToInt
mapToLog
return的都是相關的介面
mapToDouble
到時候return的就是DoubleString
那mapToInt
return的就是intString
那這個DoubleString
intString就不能用犯行了
為什麼
因為它已經都跟你講說
我是Double的資料流
我是int的資料流
你幹嘛還要用犯行啊
這已經很明顯講說
它就是Double
它就是int
好那剛才那個
我們目前這個是String
這是String的介面
那至於這個DoubleString的介面
或者intString的介面
相對的
它的一些方法我們來看一下
我們考題是
mapToDouble
或者mapToInt
那我們直接先看一下
DoubleString這個interface
好那DoubleString這個interface
你會發現它的方法
是不是跟剛才String的方法
差不多
那只是它有多一個
Average這個方法
那我們的String介面就沒有了
ok
那再來再看一下它的Reduce
那它的Reduce
是不是跟剛才
我們那個String介面的Reduce
都是雷同
那只是它調用的這個
Functional Interface不一樣
我們剛才那個Reduce
就是String的Reduce
它調用的是這個叫
BinaryOperator
對不對
那我們現在這個叫DoubleString
調用的當然就是
DoubleBinaryOperator
那一樣
行參如果只有一個
Return的一樣是
Optional的列別物件
只是它的Optional叫
OptionalDouble
那待會我們如果是
那個IntString的話
這個就是OptionalInt
ok
來那兩個行參
它就是Double
那只是Reduce
DoubleString
Reduce
它裡面的那個介面
叫DoubleBinaryOperator
那DoubleBinaryOperator
它的那個抽象方法
也就不是Apply了
那我們來看一下
它的抽象方法
你可以看到
它並沒有繼承誰
所以它的抽象方法
跟我們那個什麼ByFunction
那個什麼BinaryOperator
BinaryOperator是
IntentByFunction
那UnaryOperator
IntentFunction
那它們的抽象方法都叫
Apply
都叫Apply
那目前這個是
DoubleBinaryOperator
那它的抽象方法叫
ApplyAsDouble
不一樣啦
那不一樣
然後它裡面
因為它就不能用犯行啦
已經都跟你講Double
你要犯什麼行啦
所以你會發現
它這個是DoubleLeft
DoubleRight
等於是第一個參數
第二個參數
那Return的資料型態就是Double
那相對的
IntString
各位應該就知道
它一定就是
Apply
而是
Int
那Return的就是
Int
裡面的行參就是
IntLeft
IntRight
我們來看一下
是不是這樣
來去找一下
MapToInt
OK
這裡是MapToInt
那Return的就是
IntString
好那
IntString這邊
我們去看一下
它的那個Reduce
有沒有
Reduce是不是就
IntBinaryOperator
那你今天假如說
行參只有一個
就是OptionalInt
那再來
IntBinaryOperator
我們看一下
它的那個抽象方法
是不是就是
Apply
而是Int
那剛才那個
DoubleBinaryOperator
是Apply
而是Double
Return的就是Int
這很容易理解
OK
好那再來我們看一下
OptionalDouble好了
MapToDouble
Return的是DoubleString
那DoubleString
如果你的行參
Reduce的行參只有一個
它Return的是
OptionalDouble
來這裡
我們看一下
Reduce
如果
它的行參只有一個
DoubleBinaryOperator
Return的就是
OptionalDouble
那這個OptionalDouble
有沒有看到
它其中有一個叫
IfPresent
就是說
如果你裡面有資料
因為我們Optional
這一個列別
最主要就是來處理
這個Node值
那如果是非Node
這個所謂的IfPresent
就是非Node
那非Node的話
它去調用DoubleConsumer
Consumer是一個消費型
我們就直接
可以做輸出
它沒有Return
記得
所以這邊
DoubleConsumer
你可以看到
它的抽象方法
也是Accept
那只是它不能用犯行
因為就是Double
所以就是Double Value而已
到時候就可以直接輸出了
好
那這幾個
Functional Interface
還有我們那個Optional類
還有一些Reduce的方法
這個都瞭解了之後
我們直接來看一下考題
那看考題
老師就直接以程式
來佐證
它現在
考題的Line 1是這樣
考題的Line 1
就是先把目前這個List
這個List是什麼
List
透過List.of
把後面這兩個
Employee的列別物件
把這兩個Employee的列別物件
變成是我的一個集合List
然後Employee的列別
它有兩個欄位
一個叫Name
一個叫Salary
所以它這邊就NewEmployee
姓名叫John
然後它的薪資8萬
一個叫Scott
薪資是9萬
然後這裡宣告兩個變數
是大致是0.0
Ratio比例
薪資比1.0
然後這裡有一個Binary Operator
那Binary Operator事實上
它就是Items by Function
兩個進一個出
資料型態都是Double
來老師先把這個
先用匿名列別寫一下
然後我們直接去玩一下
這個Binary Operator
我們是不是直接就去
New
Binary Operator
然後一樣我們放
用一下範型
因為它的資料
就是Double
對不對
好 左大括號
右大括號
那這一邊
這裡不小心多加一個分號
這一邊分號
然後緊接著它跟你講說
這個Binary Operator
有一個Apply的抽象方法
你沒有去實作
所以我滑鼠指標
也到上面
它就跟你講說
你要去實作這個
Unimplemented Message
好 我們點一下
有沒有
它是不是就
抽象方法就Apply
我們去實作
兩個
一個T一個U
那我Return
我就直接Return
Return就是兩個相加
Return T加U
T加U
OK
好 那現在我只要說
很單純的
我就直接輸出
老師直接去輸出
我的VO
然後
點
Apply
我裡面放10.5
另外一個
20.5
好
它到時候印出來
是不是就兩個相加
這個都沒有輸出
不會影響
來 我現在直接去執行
是不是就兩個相加
10.5加20.5
是不是就31.0
OK
那目前這個是匿名
內部列別的寫法
我是不是可以
直接就把它轉成
考題的Lambda表達式
那我慢慢去轉
慢慢去轉
這個
加一個Lambda操作符
然後
Return
OK
就寫成這個樣子
對不對
那再來
我們的資料型別
是不是就可以
類型往前推定
所以這個地方
可以把資料型態
刪掉
OK
那再來
考題它就是
不是用P跟U
你這個是變數
你要寫XY
寫什麼隨便你
考題是寫A跟B
我們就A跟B
這個是A跟B
OK
那再來
一般我們敘述只有一行
是不是就可以
把大括號省列掉
那只是這以前
在介紹Lambda表達式
就講過了
Return跟大括號相依為命
你如果把大括號刪掉
Return沒有刪掉
它就錯了
所以Return跟大括號相依為命
有Return就要有大括號
沒有Return就不能有大括號
OK
所以我已經又把它回復成
剛才的這樣的一個
Lambda表達式
那各位也知道
事實上它就是在做
加的動作
在做加
就是我們的薪資
8萬塊加9萬塊
然後它這個Reduce
Reduce它是從多少
從start
從0.0開始
所以到時候這個
我們去印出
Reduce加兩個參數
Return的是不是就是Double
我們再回過來看一下API
這邊Reduce
這個是那個DoubleString
我們要回到String
你可以看到這個Reduce
如果加兩個
就是加兩個行參
它Return的就是你的資料型態
那我們現在是Double
所以它當然就是Double
你如果丟的是一個
就是它的那個
Binary Operator的這個函數式介面
Return是一個Optional Layer
所以我們再看一下
它現在是不是丟兩個行參
一個就是我們Start
一個就是我們的Binary Operator
就是它
所以這個我們到時候去印出
Total Salary
印出來當然就是
剛開始是0.0
所以我們到時候印出來
就是
這個17萬
就17萬
來那我這邊把這一行
取消註解
去印一下這個Total Salary
有沒有
它是不是就是17萬
剛才這個31是我們在試的
我把這一行刪掉
那至於這個是Start
是Start我假如說
我把它設成
這個
100好了
那100到時候它去加
就是你要從100加
而不是從0.0加
那從100加到時候這個
Total Salary就是
17萬100了
就多了100出來
是不是17萬100
OK
阿考題是0.0
我們就0.0
那這一個Map
Map就是A進去B出來
把狗變成貓
阿這個Map就是
1就是我們的這個
一個一個的
ImportEach列別物件
阿一個一個的
ImportEach的列別物件
進來之後
它只是要求得它的什麼
求得它的薪資而已阿
1.Get Salary
然後去乘上什麼
乘上我們的Ratio
所以
8萬乘以1.0
還是8萬阿
你這邊如果把它改成2的話
哇那到時候就是大家
薪資都兩倍
16萬加18萬
就變成
34萬了
來我們去執行一下
有沒有它變34萬
可是考題這邊
薪資比就1.0而已
好那這一行
這樣應該懂意思了
那現在考題就是說
這四行
哪一行可以取代
這個剛才的這一行
好所以我們把它先註解掉
這個我也先
註解掉
這個答案是
它是這樣
選項是這樣
來那我們先看一下
第38行的
這一個選項
這個選項List.String
把目前的List
集合
透過String的方法
把它變成是一個資料流
那變成是一個資料流
用MapToDouble
讓它變成是一個DoubleString
這個剛才API
都已經有看過了
我們直接按Ctrl鍵
直接來看它Return
是不是就是一個DoubleString了
Return是一個
DoubleString之後
緊接著調用DoubleString的
Reduce
DoubleString的Reduce
裡面放的
並不是
並不是什麼
並不是BinaryOperator
它裡面放的是什麼
是Double
BinaryOperator
並不是
我們的這個叫
BinaryOperator
它兩個參數
Return的是一個Double
這正確了
那問題它這一個
另外一個行參
我們再看API好了
或者直接老師
按住Ctrl鍵
點一下這個Reduce來看一下
有沒有
它這邊是不是要調用的是
DoubleBinaryOperator
因為我們透過
MapToDouble
Return的就是一個DoubleString
那DoubleString的Reduce
它調用的是這個
DoubleBinaryOperator
所以我們假如說
把剛才的BinaryOperator
改成
DoubleBinaryOperator
就可以了
我們來玩一下好了
我現在直接把這個
BinaryOperator
我就直接把它改成
DoubleBinaryOperator
因為我們MapToDouble
它Return的
就是一個DoubleString的
資料流
所以我這邊把它改成Double
因為Double都已經是Double了
你就不能再去用
犯行了
我把這個犯行刪掉
各位有沒有發現
這樣是不是就可以了
那可以到時候我再去執行
完全一模一樣
所以
這一個選項是錯的
這個選項是錯的
因為它MapToDouble
已經變成DoubleString了
那DoubleString的Reduce
這個
行刪調用的是
我們的DoubleBinaryOperator
所以它是錯的
來我再把它改回來了
Ctrl加1
OK
這個是錯的
我畫個叉叉
好那再來
我們把這一個取消註解
那這一個取消註解之後
list.string.map.reduce
好它Reduce
放一個的話
Return是不是就是一個
Optional
它Return是一個Optional
來我們看一下
Ctrl鍵按著我點一下Reduce
對不對
它Return是一個Optional
那這個Optional
來我們來看一下API好了
這個剛才也有看過了
進到Optional類之後
有沒有發現
它這裡有一個叫IfPresent
它裡面放的是
Consumer的介面
當然就沒有Return
丟個東西
它的那個
抽象方法是
Accept
你丟個東西進去
然後它就輸出
那沒有Return
Consumer的介面就這樣
Accept你丟個東西
看你要做什麼
它沒有Return
所以呢
IfPresent的意思就是說
如果有資料
它不是Nodes
你要做什麼
你就直接去做輸出
它沒有Return
既然都沒有Return
這個很明顯這個就錯了
我們再回過頭來看一下
對不對
你用IfPresent它就沒有Return了
你怎麼還去Double
Return的是這個Double
所以它這邊
我滑鼠指標移到上面
它是不是就寫Type mismatch
Cannot convert from void
to double
因為這個並沒有Return
所以這個
這個選項也是錯了
如果考題是這麼寫
考題是這麼寫
P.DoubleValue
就是如果存在的話
就把它轉成DoubleValue
然後我們再去
做輸出好了
因為這邊有兩行
兩行的話
就不能把那個
大括號省略了
因為這是一個Consumer嘛
那Consumer我們有兩行
我就加個大括號
另外一行我直接把P
輸出了
這樣就可以了
我把這一行先註解掉
到時候輸出
也是17萬
它就直接輸出17萬
就是我這一行
程式這麼改纔可以
因為我們IfPresent
它是裡面調用的
是Consumer
它也沒有Return
它是Value的
所以考題這樣
來我再還原
所以考題它說要Return
有個Double的資料型態
所以這個
也是錯的
一樣我畫個XX
代表這個選項都不對
好來繼續我們看一下
第三個選項
那第三個想像
這個一打開都沒有錯
應該這個就正確了
我們來看一下
這個List.String
把它變成資料流
然後再去調用Map的方法
把Employee
只求得他的薪資
然後乘上
薪資比
所以Return的當然就是一個
這個Double的資料
然後再來
它再去把它Reduce
就是再去把它做
歸納總結
然後目前它只丟一個參數
它只丟一個參數
Return的是不是就是
Optional的列別物件
那Optional列別物件
再去調用
Or Else
那這個Or Else各位你就可以
再去複習一下
如果忘了Optional
複習一下之前有關於
Optional的章節
那Or Else就是說
它這邊
如果你的Optional是
Null的話
它就代0.0
非Null
就是代表有值
那我們目前當然就是有值
那有值的話就
Return它的值就對了
所以這個Return
我們現在不是那個Null
就是17萬
所以它Return的當然就是17萬
所以這個Total Salary
就有17萬
來我們去執行
這邊去執行
有沒有是不是就有17萬
因為Or Else
這個方法就是說
當你是Null的時候
它才會套用
0.0
非Null的話
就直接套用
套用什麼
就直接套用
這個原本的值
那這邊
不清楚還是去看一下
因為時間的關係我就不再
額外做講解了
所以答案就是它了
來那繼續我們看最後一個
最後一個為什麼錯呢
它一樣
Map To Double
Map To Double是不是就變成
Double String
變成Double String它去直接調用
這個Sum
這一看就知道了
這一看就一定是錯了
因為它不是一個方法
它是一個屬性或幹嘛
哪有這樣的東西
那我們看一下
Double String有沒有
Sum的方法
如果有Sum的方法我們把它補個小括號
答案就正確了
那我們來看一下API好了
我們去找一下
Double String
好那Double String
像String的介面
並沒有Average
要什麼Double String
Int String Long String
纔有這個方法
不然你String的介面
是沒有的
那目前這個是Double String
那Double String是不是就有一個Sum
加總
Return是一個Double
那就剛好了
所以來我只要把它補一下
補個小括號
程式就整張好
OK
所以這一個
它就少了一個小括號
所以它也是錯的
好那答案
就是它
All Else
所以我們回來
都已經講解完了
這一題也花了蠻多時間
最主要的啦
像講的這一些
Functional Interface
還有這一些列別
後續其他
雷同的考題都還會再
考到各位觀念有清楚
很容易就可以
再解題了
所以這個答案就是C
答案就是它
那A
之所以錯的話
是因為Map To
Double
它Return的是一個Double String
那Double String
Reduce裡面調用的
並不是
Binary Operator
它調用的是
Double Binary Operator
因為它的抽象方法
也不一樣嘛
像這個Binary Operator
它的抽象方法是Apply
那我們那個
Double Binary Operator
它的抽象方法是什麼
是Apply a Stable
不一樣喔
所以A是錯的
那V呢
V是最主要的是
這個Apparent
因為我們Reduce裡面放了
一個行參
Return的是一個Optional Lay
Optional Lay去調用
Optional Lay的這個方法
當然是正確
問題是Apparent這個方法
它是Void
它裡面放的是Consumer的
函數式介面
所以它是Void
那Void你怎麼可能去Return
所以這也是錯的
那C剛才講過
這正確
那D只要有加小括號
它也就正確了
那繼續我們
看下一題了
繼續我們看一下45題
那45題
這也是一個觀念題
所謂的
Try Cache Finally
那
這邊我們就直接解題了
因為假如說你對於這個
Try Cache Finally不是很清楚
一樣請參照
之前在介紹
例外處理的章節
來那我們直接看一下
它說輸出為什麼
好所以在主方法
這一邊它去New了一個
有刃45
然後Test去呼叫
Divide
就是去呼叫它的物件方法
那這個物件方法
它現在Try Cache
就是除法
那除法Number現在是1
然後呢
除為0
除數為0
那除數為0一定就會拋出
一定就會去被這個
Arithmetical
就是我們的算數例外
這樣的一個錯誤
就會被Cache到了
那Cache到它把這個Number
設為100
Number設為100之後
那緊接它這裡有
輸出啦
可是你目前
這裡已經被Cache到了
所以這一行它就不會輸出了
它這一行不會輸出
它不會輸出緊接著會去
輸出這個
Num
它輸出Num是印100嗎
不是啦
因為這裡有個Finally
這個Finally是無論如何
一定都會執行的
所以剛開始Num是100
可是它要結束
就是要結束這個Try Cache
可是Finally是無論如何
都要執行
所以緊接著Number是300
最後再印出Number
所以答案當然就是A了
這一題就是一個觀念題而已
可是今天假如說
這個背除數都正確
DIV是1
這個也是1
就不會被Cache到了
它不會被Cache到的話
它
會先印出
會先印出這個
Exception
它印完Exception之後
緊接著
因為沒有被Cache到
沒有被Cache到
可是Finally會不會執行
不管你有沒有Cache到
我Finally一定會執行
所以到時候這個Number
是300
是300的話
這邊又會再印300
所以它先印那個
Exception
Exception印好了之後
再印300
那我們用程式來佐證一下
好
這邊我為了讓各位看得更清楚
我直接設定個中斷點
那我們直接去
除錯
好
除錯它就已經跑到
直接去呼叫
這個Union的
物件方法
Test是Union45的列別物件
那我們去呼叫
它的Divide這個方法
來,所以我現在我要去
Step Into
好,那Step Into
是不是就已經進到這個
Divide的方法
目前Num是1
Div是0,所以它馬上就會
被這個Cache到了
我在Step Over
有沒有,是被它Cache到了
被它Cache到緊接著
我的Num
就是100
再來呢,就會跳到
Finally去了,因為Finally
是無論如何都會執行
我再去Step Over
有沒有,這個Num
等於300
這樣就已經結束
Try Cache Finally
最後去印出這個Num
所以印出來的結果就是
300
OK,那程式
就結束了
好,這樣就結束了
好,那我現在再改一下
我不要讓它
去Cache到這個
Arithmetic Exception
我把Div
就是我的那個
除數設為1
除數設為1,這時候就
不會被Cache到了
一樣我設定
中斷點,來
我們一樣去除錯
好,那我Step Into
進入到Divide的
這個方法,那這時候
Num等於
Num除Div
1除1還是1
所以我現在Step Over
對不對,它緊接著
它先印Exception
好,Exception印完了
都不會被Cache到
它不會被Cache到,這個Finally
是無論如何一定會執行
所以緊接著它就跳到Finally
它設定我的Num
為300,然後緊接著
再去印出300
OK,然後
程式就結束了
OK,那這一堂課
也花了很多時間
我們就先到這裡
下課休息一下
拜拜,下回見
