futures.toArray(new CompletableFuture[0])
是一種常見的將 List
轉換為數組的方式,特別是在需要將 List
傳遞給接受數組參數的方法時。讓我們詳細解釋一下這段代碼的具體含義和工作原理。
代碼解釋
假設 futures
是一個 List<CompletableFuture<Map<String, Object>>>
,那么 futures.toArray(new CompletableFuture[0])
的作用是將這個 List
轉換為一個 CompletableFuture<Map<String, Object>>
數組。
步驟解析
-
futures.toArray(...)
:toArray
是List
接口中的一個方法,用于將列表轉換為數組。- 這個方法有兩個重載版本:
Object[] toArray()
:返回一個包含列表中所有元素的數組。<T> T[] toArray(T[] a)
:返回一個包含列表中所有元素的數組,數組的運行時類型與指定的數組相同。
-
new CompletableFuture[0]
:- 這里創建了一個長度為 0 的
CompletableFuture
數組。這個數組僅用于指定返回數組的類型。 - JVM 將使用這個數組的類型信息來創建一個新的數組,該數組的大小與
futures
列表的大小相同,并包含futures
列表中的所有元素。
- 這里創建了一個長度為 0 的
-
futures.toArray(new CompletableFuture[0])
:toArray
方法將返回一個包含所有futures
元素的數組。由于傳入的數組類型是CompletableFuture
,返回的數組也是CompletableFuture
類型。- 如果傳入的數組長度小于列表的大小(在這里是 0),
toArray
方法將創建一個新的數組,其大小等于列表的大小。 - 如果傳入的數組長度大于或等于列表的大小,列表的元素將被存儲在這個數組中,并且數組的剩余部分(如果有的話)將被設置為
null
。
為什么使用 new CompletableFuture[0]
使用 new CompletableFuture[0]
是一種慣用法,原因如下:
- 類型安全:它確保返回的數組與列表中的元素類型匹配,避免了類型轉換的問題。
- 性能:在某些 JVM 實現中,傳遞一個大小為 0 的數組可能會比傳遞一個非空數組更高效,因為 JVM 不需要檢查數組的大小。
- 簡潔性:這種方式簡潔明了,易于理解和維護。
示例
假設你有一個 List<CompletableFuture<Map<String, Object>>> futures
,可以如下使用 toArray
方法:
List<CompletableFuture<Map<String, Object>>> futures = new ArrayList<>();
futures.add(CompletableFuture.supplyAsync(() -> {Map<String, Object> result = new HashMap<>();result.put("key1", "value1");return result;
}));
futures.add(CompletableFuture.supplyAsync(() -> {Map<String, Object> result = new HashMap<>();result.put("key2", "value2");return result;
}));CompletableFuture<Map<String, Object>>[] futuresArray = futures.toArray(new CompletableFuture[0]);// futuresArray now contains the elements of the futures list as an array
小結
futures.toArray(new CompletableFuture[0])
是將 List<CompletableFuture<Map<String, Object>>>
轉換為 CompletableFuture<Map<String, Object>>
數組的一種簡潔和高效的方法。這種方式不僅確保了類型安全,還提高了代碼的可讀性和維護性。