美图手机投射功能在哪_在Java 8中进行投射(还有其他功能?)
美圖手機(jī)投射功能在哪
將實(shí)例轉(zhuǎn)換為設(shè)計(jì)不良的類(lèi)型。 盡管如此,在某些情況下沒(méi)有其他選擇。 從第一天開(kāi)始,執(zhí)行此功能就已成為Java的一部分。
我認(rèn)為Java 8提出了對(duì)這種古老技術(shù)稍加改進(jìn)的需求。
靜態(tài)鑄造
Java中最常見(jiàn)的轉(zhuǎn)換方法如下:
靜態(tài)鑄造
Object obj; // may be an integer if (obj instanceof Integer) {Integer objAsInt = (Integer) obj;// do something with 'objAsInt' }這使用了嵌入到該語(yǔ)言中的instanceof和cast運(yùn)算符。 實(shí)例轉(zhuǎn)換為的類(lèi)型(在這種情況下為Integer在編譯時(shí)必須是靜態(tài)已知的,因此我們將其稱(chēng)為靜態(tài)轉(zhuǎn)換。
如果obj不是Integer ,則上述測(cè)試將失敗。 如果我們嘗試將其強(qiáng)制轉(zhuǎn)換,則會(huì)得到ClassCastException 。 如果obj為null ,則它無(wú)法通過(guò)instanceof測(cè)試,但可以強(qiáng)制轉(zhuǎn)換,因?yàn)閚ull可以是任何類(lèi)型的引用。
動(dòng)態(tài)鑄造
我很少遇到的一種技術(shù)是使用Class上與運(yùn)算符相對(duì)應(yīng)的方法:
動(dòng)態(tài)轉(zhuǎn)換為已知類(lèi)型
Object obj; // may be an integer if (Integer.class.isInstance(obj)) {Integer objAsInt = Integer.class.cast(obj);// do something with 'objAsInt' }請(qǐng)注意,盡管在此示例中,在編譯時(shí)也知道要強(qiáng)制轉(zhuǎn)換為的類(lèi),但不一定如此:
動(dòng)態(tài)鑄造
Object obj; // may be an integer Class<T> type = // may be Integer.class if (type.isInstance(obj)) {T objAsType = type.cast(obj);// do something with 'objAsType' }因?yàn)轭?lèi)型在編譯類(lèi)型時(shí)是未知的,所以我們將其稱(chēng)為動(dòng)態(tài)轉(zhuǎn)換。
類(lèi)型和空引用錯(cuò)誤的實(shí)例的測(cè)試和轉(zhuǎn)換結(jié)果與靜態(tài)轉(zhuǎn)換完全相同。
由vankarsten在CC-BY-NC 2.0下發(fā)布 。
在流中投放和可選
現(xiàn)在
轉(zhuǎn)換Optional的值或Stream的元素是一個(gè)兩步過(guò)程:首先,我們必須過(guò)濾掉錯(cuò)誤類(lèi)型的實(shí)例,然后才能將其轉(zhuǎn)換為所需的類(lèi)型。
使用Class上的方法,我們使用方法引用來(lái)實(shí)現(xiàn)。 以O(shè)ptional為例:
強(qiáng)制轉(zhuǎn)換
Optional<?> obj; // may contain an Integer Optional<Integer> objAsInt = obj.filter(Integer.class::isInstance).map(Integer.class::cast);我們需要兩個(gè)步驟來(lái)執(zhí)行此操作沒(méi)什么大不了的,但我覺(jué)得這有點(diǎn)尷尬,而且比必要時(shí)更冗長(zhǎng)。
未來(lái)(也許)
我建議在Class上實(shí)現(xiàn)返回Optional或Stream強(qiáng)制轉(zhuǎn)換方法。 如果傳遞的實(shí)例類(lèi)型正確,則將返回Optional或包含轉(zhuǎn)換實(shí)例的Singleton Stream 。 否則,兩者都將為空。
實(shí)現(xiàn)這些方法很簡(jiǎn)單:
課堂上的新方法
public Optional<T> castIntoOptional(Object obj) {if (isInstance(obj))return Optional.of((T) obj);elseOptional.empty(); }public Stream<T> castIntoStream(Object obj) {if (isInstance(obj))return Stream.of((T) obj);elseStream.empty(); }這使我們可以使用flatMap一步進(jìn)行過(guò)濾和轉(zhuǎn)換:
該死的FlatMap
Stream<?> stream; // may contain integers Stream<Integer> streamOfInts = stream.flatMap(Integer.class::castIntoStream);類(lèi)型錯(cuò)誤或引用為空的實(shí)例將使實(shí)例測(cè)試失敗,并導(dǎo)致空的Optional或Stream 。 永遠(yuǎn)不會(huì)有ClassCastException 。
成本與收益
還需要確定這些方法是否會(huì)發(fā)揮自己的作用:
- 實(shí)際可以使用多少代碼?
- 它們會(huì)提高普通開(kāi)發(fā)人員的可讀性嗎?
- 節(jié)省一行值得嗎?
- 實(shí)施和維護(hù)它們的成本是多少?
我回答的問(wèn)題不多 , 很少 , 是的 , 很少 。 因此,它接近于零和游戲,但我確信這是一個(gè)很小但不可忽略的收益。
你怎么看? 您看到自己使用這些方法了嗎?
翻譯自: https://www.javacodegeeks.com/2015/07/casting-in-java-8-and-beyond.html
美圖手機(jī)投射功能在哪
總結(jié)
以上是生活随笔為你收集整理的美图手机投射功能在哪_在Java 8中进行投射(还有其他功能?)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 化学品备案(化学集备案)
- 下一篇: java美元兑换,(Java实现) 美元