2014-12-03 15 views
13

Arrays.asList(E[] e) trả về dạng xem của mảng dưới dạng List, nhưng khi mảng là rỗng, nó sẽ ném một NullPointerException.Mảng rỗng để trống danh sách

Arrays.asList(null); //NullPointerException. 

Trên thực tế tôi đang làm

List list = possibleNullArray != null ? Arrays.asList(possibleNullArray) : Collections.EMPTY_LIST; 

Tuy nhiên, tạo ra một lớp Utility trong dự án của tôi chỉ dành cho mục đích này là một điều mà tôi không muốn làm. Có một số lớp tiện ích, hoặc thư viện như Apache Commons hoặc Guava để chuyển đổi mảng trống thành rỗng List? (tức là bộ chuyển đổi không an toàn giữa các mảng và Bộ sưu tập).

Bạn giải quyết vấn đề này như thế nào?

+0

ofcourse bạn sẽ nhận được NPE bạn thiết lập nó như là một null, Arrays.asList(); chuyển đổi đối tượng của bạn thành danh sách mảng/mảng/mảng nếu im không nhầm. – Secondo

+0

Là một sự lựa chọn tốt để sử dụng các bộ sưu tập rỗng o mảng độ dài không thay vì null, khi bạn có khả năng đọc được trong đầu. Im không discusing lý do tại sao Array.asList (null) ném một NullPointerException. Đây là một quyết định tồi tệ của người sáng tạo. Im hỏi về một lớp tiện ích hoặc thư viện để chuyển đổi các bộ sưu tập null arras o thành các mảng hoặc các bộ sưu tập rỗng. – Ezequiel

+0

cố gắng nhìn vào câu trả lời của tôi – Secondo

Trả lời

8

Tôi không biết về bất kỳ phương pháp util trong Apache Commons/ổi đó sẽ tạo ra một sản phẩm nào List dụ ra khỏi null.

Điều tốt nhất bạn có thể làm là khởi tạo mảng có thể null trước, ví dụ: với ArrayUtils.nullToEmpty(). Loại bỏ các null càng sớm càng tốt.

SomeObject[] array = ArrayUtils.nullToEmpty(possiblyNullArray); 
+1

Ngoài ra, bạn có nguyên 'Danh sách' ở đó. Tôi hy vọng mã của bạn thực sự được mở rộng. Không có chỗ cho các bộ sưu tập thô trong mã mới. –

+1

Tôi chấp nhận câu trả lời của bạn vì tôi nghĩ đây là cách tốt để bình thường hóa các thông số nhận được từ các phần mã khác mà bạn không kiểm soát. – Ezequiel

+0

Câu trả lời này không lý tưởng vì những lý do mà @Slanec chỉ ra. –

29

Bạn có thể sử dụng Java 8 Optional:

String[] arr = null; 
List<String> list = Arrays.asList(Optional.ofNullable(arr).orElse(new String[0])); 
+0

Điều này. Trên Java 7, bạn cũng có thể thực hiện với 'Optional' của Guava. Hoặc khái niệm tương tự với một mã khác nhau - 'Objects.firstNonNull()' của Guava ' –

+0

Cảm ơn bạn đã trả lời, tôi đã bình chọn cho bạn, nhưng một câu trả lời Slanec nghĩ phù hợp hơn với vấn đề của tôi. – Ezequiel

7

Bạn có thể sử dụng Java 8 OptionalStream

Optional.ofNullable(possibleNullArray) 
     .map(Arrays::stream) 
     .orElseGet(Stream::empty) 
     .collect(Collectors.toList()) 
Các vấn đề liên quan