1.數據轉換

該類Stream<T>還有一個方法可以讓您將數據從一種類型轉換為另一種類型。這個方法是map()

它還返回一個流,但具有不同類型的元素。該map()方法將一個將一種數據類型轉換為另一種數據類型的函數作為方法參數。

例子:

Stream<Integer> stream = Stream.of(1, 2, 3, 4, 5);
Stream<String> stream2 = stream.map((x) -> String.valueOf(x));
將流轉換IntegerString

傳遞給該方法的函數參數map()採用數字x並返回其字符串表示形式。順便說一句,您可以將這段代碼寫得更緊湊:

Stream<Integer> stream = Stream.of(1, 2, 3, 4, 5);
Stream<String> stream2 = stream.map(String::valueOf);
將流轉換IntegerString

將字符串轉換為數字

同樣,您可以編寫代碼將字符串轉換為數字——這也不復雜:

Stream<Integer> stream = Stream.of(1, 2, 3, 4, 5);
Stream<String> stream2 = stream.map(String::valueOf);
Stream<Integer> stream3 = stream2.map(Integer::parseInt);
將流轉換StringInteger

將字符串轉換為URI

數據轉換操作可能是資源和時間密集型的。假設我們要將字符串集合轉換為 URI 對象。這很容易做到,因為 URI 構造函數將字符串作為參數。

ArrayList<String> list = new ArrayList<String>();
list.add("https://google.com");
list.add("https://linkedin.com");
list.add("https://yandex.com");

Stream<URI> stream = list.stream().map( URI::new );
將流轉換StringURI

我們創建了一個集合併用 3 個網址填充了它。然後我們Stream<String>從集合中得到一個對象,然後從那個流中我們得到一個Stream<URI>對象。我們向 map 方法傳遞了對將用於將每個字符串轉換為 URI 的方法的引用。

此方法(構造函數)必須將 aString作為參數。一切似乎都很完美……


2. 例外情況

我們可能期望上面的代碼應該可以工作,但它不會——程序不會編譯。並不是因為我們在某個地方犯了錯誤,而是因為 Java 的創造者搞砸了。

曾幾何時,他們有一個絕妙的主意,就是URISyntaxException在類構造函數中添加一個已檢查的異常 () URI!並且此類異常必須包裝在try-catch.

所以我們代碼的最後一行看起來像這樣:

Stream<URI> stream = list.stream().map(str ->
{
  try
  {
     return new URI(str);
  }
  catch (URISyntaxException e)
  {
     e.printStackTrace();
     return null;
  }
});

我們能說什麼?在使用檢查異常之前你應該三思。在構造函數中使用它們之前請三思。