日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

在Java 8中进行投射(还有其他功能?)

發布時間:2023/12/3 java 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 在Java 8中进行投射(还有其他功能?) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

將實例轉換為設計不良的類型。 盡管如此,在某些情況下沒有其他選擇。 從第一天開始,這種能力就已經成為Java的一部分。

我認為Java 8提出了對這種古老技術稍加改進的需求。

靜態鑄造

用Java進行轉換的最常見方法如下:

靜態鑄造

Object obj; // may be an integer if (obj instanceof Integer) {Integer objAsInt = (Integer) obj;// do something with 'objAsInt' }

這使用了嵌入到該語言中的instanceof和cast運算符。 實例轉換為的類型(在本例中為Integer在編譯時必須是靜態已知的,因此我們將其稱為靜態轉換。

如果obj不是Integer ,則上述測試將失敗。 如果我們嘗試將其強制轉換,則會得到ClassCastException 。 如果obj為null ,則它無法通過instanceof測試,但可以強制轉換,因為null可以是任何類型的引用。

動態鑄造

我很少遇到的一種技術是使用Class上與運算符相對應的方法:

動態轉換為已知類型

Object obj; // may be an integer if (Integer.class.isInstance(obj)) {Integer objAsInt = Integer.class.cast(obj);// do something with 'objAsInt' }

請注意,盡管在此示例中,在編譯時也知道要強制轉換為的類,但不一定如此:

動態鑄造

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' }

因為類型在編譯類型時是未知的,所以我們將其稱為動態轉換。

類型和空引用錯誤的實例的測試和轉換結果與靜態轉換完全相同。

由vankarsten在CC-BY-NC 2.0下發布 。

在流中投放和可選

現在

轉換Optional的值或Stream的元素是一個兩步過程:首先,我們必須過濾掉錯誤類型的實例,然后才能將其轉換為所需的類型。

使用Class上的方法,我們使用方法引用來實現。 以Optional為例:

強制轉換

Optional<?> obj; // may contain an Integer Optional<Integer> objAsInt = obj.filter(Integer.class::isInstance).map(Integer.class::cast);

我們需要兩個步驟來執行此操作沒什么大不了的,但是我覺得這有點尷尬,而且比必要時更冗長。

未來(也許)

我建議在Class上實現返回Optional或Stream轉換方法。 如果傳遞的實例類型正確,則將返回Optional或包含轉換實例的Singleton Stream 。 否則,兩者都將為空。

實現這些方法很簡單:

課堂上的新方法

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一步進行過濾和轉換:

該死的FlatMap

Stream<?> stream; // may contain integers Stream<Integer> streamOfInts = stream.flatMap(Integer.class::castIntoStream);

類型錯誤或引用為空的實例將使實例測試失敗,并導致空的Optional或Stream 。 永遠不會有ClassCastException 。

成本與收益

還需要確定這些方法是否會發揮自己的作用:

  • 實際可以使用多少代碼?
  • 它們會提高普通開發人員的可讀性嗎?
  • 節省一行值得嗎?
  • 實施和維護它們的成本是多少?

我回答的問題不多 , 很少 , 是的 , 很少 。 因此,它接近于零和游戲,但我確信這是一個很小但不可忽略的收益。

你怎么看? 您看到自己使用這些方法了嗎?

翻譯自: https://www.javacodegeeks.com/2015/07/casting-in-java-8-and-beyond.html

總結

以上是生活随笔為你收集整理的在Java 8中进行投射(还有其他功能?)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。