2011-07-30 23 views
6

Có cách nào tốt hơn để sử dụng Arrays.asList như một bộ khởi tạo hàng loạt Danh sách không? Quan tâm là điều này là tiết và liên quan đến một lớp học và phương pháp không liên quan.là có một thay thế tốt hơn để liệt kê <T> initalization hơn gọi ra Arrays.asList?

List<Double> myList = new ArrayList<Double>(Arrays.asList(3.01d, 4.02d, 5.03d)); 

Chỉnh sửa: Câu hỏi này liên quan đến khởi tạo hàng loạt thường có nhiều hơn ba giá trị được hiển thị trong ví dụ.

+0

Điều này có vẻ hoàn toàn tốt (cũng như tối ưu hóa được đề xuất bởi MatrixFrog, nếu danh sách sẽ là chỉ đọc). Một cuộc gọi phương thức duy nhất là trong một khởi tạo sẽ không tạo ra sự khác biệt, hiệu suất khôn ngoan. – JimN

Trả lời

5

Nếu bạn biết rằng bạn sẽ không cần thêm bất cứ điều gì để danh sách sau này, bạn chỉ có thể làm

List<Double> myList = Arrays.asList(3.01d, 4.02d, 5.03d); 

Tôi chắc rằng danh sách được trả về từ Arrays.asList có thể là mod ified, nhưng chỉ trong đó bạn có thể thay đổi các yếu tố có đó - bạn không thể thêm các yếu tố mới vào nó.

1

Một lựa chọn khác sẽ như một lớp bên trong vô danh:

List<Double> myList = new ArrayList() { 
{ 
    add(3.01d); 
    add(4.02d); 
    add(5.03d); 
} 
}; 
+0

Tôi đã chỉnh sửa câu hỏi để làm rõ rằng đó là khởi tạo hàng loạt. – H2ONaCl

+0

@Broiyan Ok, đã chỉnh sửa câu trả lời của tôi bằng một giải pháp thay thế khác. –

1

Vâng, bạn có thể làm điều đó như thế này:

List<Double> myList = Arrays.asList(new Double[]{3.01d, 4.02d, 5.03d}); 
// or 
List<Double> myList = Arrays.asList(3.01d, 4.02d, 5.03d); 
+2

Phân bổ 'Double []' là không cần thiết, vì 'Arrays.asList' có dạng" varargs ". – MatrixFrog

+2

Điều quan trọng cần lưu ý là danh sách được trả về bởi 'Arrays.asList (...)' được hỗ trợ bởi mảng đã cho và do đó * độ dài cố định *. Để minh họa, hãy thử gọi 'myList.add (1.0d)' sau khi khởi tạo danh sách và bạn sẽ nhận được một UnsupportedOperationException. Nếu bạn muốn thêm nhiều phần tử vào danh sách tại một số điểm, hãy chuyển kết quả của phương thức 'asList (...)' sang hàm tạo bản sao 'ArrayList'. –

3

Sử dụng guava,

List<Double> myList = Lists.newArrayList(3.01d, 4.02d, 5.03d)); 
0

Không phù hợp với câu hỏi 100%, nhưng thêm câu trả lời này trong trường hợp muốn instatiate một danh sách chỉ để có thể ngay lập tức làm điều gì đó với các giá trị trong nó, so với việc chỉ tạo một Danh sách vì lợi ích của việc chỉ làm một cách đơn giản.

Với Java 8, bạn có thể sử dụng Stream.of(T... values), sau đó điều chỉnh hơi nước qua API luồng để nhận được kết quả bạn muốn từ danh sách giá trị.

Ví dụ, để có được giá trị tối đa của một loạt các giá trị ...

int maxValue = Stream.of(10, 5, 25).max(Integer::compareTo).get();

Ví dụ trên cũng rất hữu ích khi bạn muốn Math.max(#,#) chức năng loại, nhưng có nhiều hơn hai đối số quá trình.

0

Kể từ java 9 bạn có thể sử dụng phương pháp List.of nhà máy:

static <E> List<E> of​(E... elements) 

Trả về một danh sách bất biến có chứa một số tùy ý của các yếu tố.

Hoặc sử dụng ổi:

public static <E> ImmutableList<E> of(E e1, E e2,...) 

Trả về một danh sách bất biến có chứa các yếu tố nhất định, theo thứ tự.

Các vấn đề liên quan