Khởi tạo một ArrayList trong một dòng


2756

Tôi muốn tạo một danh sách các tùy chọn cho mục đích thử nghiệm. Lúc đầu, tôi đã làm điều này:

ArrayList<String> places = new ArrayList<String>();
places.add("Buenos Aires");
places.add("Córdoba");
places.add("La Plata");

Sau đó, tôi cấu trúc lại mã như sau:

ArrayList<String> places = new ArrayList<String>(
    Arrays.asList("Buenos Aires", "Córdoba", "La Plata"));

Có cách nào tốt hơn để làm điều này?


34
Nếu điều này được dự định để thử nghiệm đơn vị, hãy thử tìm kiếm. Bạn có thể viết mã kiểm tra của mình vào đó trong khi kiểm tra mã java và sử dụngArrasyList<String> places = ["Buenos Aires", "Córdoba", "La Plata"]
ripper234

3
Trong Java SE 7, bạn có thể thay thế kiểu tham số của hàm tạo bằng một tập tham số kiểu trống (<>): Map <String, List <String >> myMap = new HashMap <> ();
Hoa hồng


2
sử dụng khởi tạo giằng đôi :)
Mohammadreza Khatami

8
Stream.of ("val1", "val2"). Thu thập (Collector.toList ()); // tạo ArrayList, giải pháp Java8.
torina

Câu trả lời:


2025

Trên thực tế, có lẽ cách "tốt nhất" để khởi tạo ArrayListlà phương pháp bạn đã viết, vì nó không cần tạo mới Listtheo bất kỳ cách nào:

ArrayList<String> list = new ArrayList<String>();
list.add("A");
list.add("B");
list.add("C");

Điều hấp dẫn là có khá nhiều thao tác gõ cần thiết để tham chiếu đến listtrường hợp đó .

Có các lựa chọn thay thế, chẳng hạn như tạo một lớp bên trong ẩn danh với một trình khởi tạo cá thể (còn được gọi là "khởi tạo cú đúp"):

ArrayList<String> list = new ArrayList<String>() {{
    add("A");
    add("B");
    add("C");
}};

Tuy nhiên, tôi không quá thích phương thức đó bởi vì thứ bạn kết thúc là một lớp con ArrayListcó trình khởi tạo cá thể và lớp đó được tạo ra chỉ để tạo một đối tượng - điều đó có vẻ hơi quá mức đối với tôi.

Điều tuyệt vời là nếu đề xuất Bộ sưu tập Văn học cho Project Coin được chấp nhận (dự kiến ​​sẽ được giới thiệu trong Java 7, nhưng nó cũng không phải là một phần của Java 8.):

List<String> list = ["A", "B", "C"];

Thật không may, nó sẽ không giúp bạn ở đây, vì nó sẽ khởi tạo một thứ bất biến Listchứ không phải là ArrayList, và hơn nữa, nó chưa có sẵn, nếu nó sẽ xảy ra.


172
Xem stackoverflow.com/questions/924285 để biết thêm thông tin về khởi tạo, ưu và nhược điểm của cú đúp.
Eddie

6
@Eddie: Gọi tốt cho liên kết - một câu về khởi tạo cú đúp không đủ để mô tả đầy đủ.
coobird

2
Chỉ hoạt động nếu bạn không dựa vào Danh sách quyền anh tự động <Double> list = [1.0, 2.0, 3.0]; thất bại
Richard B

1
Bạn đang thiếu một dấu chấm phẩy trong khởi tạo danh sách kép
Don Larynx

6
Vì câu trả lời này là Project Coin được đề cập và đề cập nhiều nhất, tôi nghĩ bạn nên gọi java 9 được vận chuyển với cú pháp List.of (...): docs.oracle.com/javase/9/docs/api/java/util/ List.html # of-E ...-
Asaf

2155

Sẽ đơn giản hơn nếu bạn chỉ khai báo nó như một List- nó có phải là một ArrayList không?

List<String> places = Arrays.asList("Buenos Aires", "Córdoba", "La Plata");

Hoặc nếu bạn chỉ có một yếu tố:

List<String> places = Collections.singletonList("Buenos Aires");

Điều này có nghĩa placeskhông thay đổi (cố gắng thay đổi nó sẽ khiến UnsupportedOperationExceptionngoại lệ bị ném).

Để tạo một danh sách có thể thay đổi được cụ thể, ArrayListbạn có thể tạo một ArrayListdanh sách từ danh sách bất biến:

ArrayList<String> places = new ArrayList<>(Arrays.asList("Buenos Aires", "Córdoba", "La Plata"));

18
@Marcase: Bạn không thể thay đổi lớp của mình để sử dụng Danh sách thay vì ArrayList?
Lawrence Dol

74
Theo câu trả lời của tôi, nếu bạn không sử dụng các phương thức cụ thể ArrayList, thì sẽ tốt hơn nếu thay đổi khai báo thành List. Chỉ định giao diện, không triển khai.
Christoffer Hammarström

9
@Christoffer Hammarström: nếu anh ta thay đổi khai báo thành Danh sách và sử dụng Danh sách <String> vị trí = Arrays.asList (...); anh ấy sẽ không thể sử dụng địa điểm.add ("blabla")
maks

57
Để rõ ràng, asList(...)trả về một kích thước cố định Listlàm nổ tung các hoạt động đột biến như removeclear, những điều mà Listhợp đồng yêu cầu hỗ trợ. Ngay cả khi bạn để lại khai báo là List, bạn cần phải sử dụng List l = new ArrayList(asList(...))để có được một đối tượng không ném ngoại lệ được hỗ trợ bởi OperationNotSupport. Nguyên tắc thay thế Liskov có ai không?
Splash

5
@Splash: removeclearlà các hoạt động tùy chọn trong List, vì vậy asList(...)cũng tuân theo hợp đồng. Không nơi nào OP nói rằng anh ta cần thêm nhiều yếu tố sau, ví dụ này chỉ là một Listyếu tố cần được khởi tạo với ba yếu tố.
Christoffer Hammarström

872

Câu trả lời đơn giản

Trong Java 9 trở lên, sau khi List.of()được thêm vào:

List<String> strings = List.of("foo", "bar", "baz");

Với Java 10 trở lên, điều này có thể được rút ngắn với vartừ khóa.

var strings = List.of("foo", "bar", "baz");

Điều này sẽ cung cấp cho bạn một bất biến List , vì vậy nó không thể thay đổi.
Đó là những gì bạn muốn trong hầu hết các trường hợp bạn đang chuẩn bị nó.


Java 8 trở về trước:

List<String> strings = Arrays.asList("foo", "bar", "baz");

Điều này sẽ cung cấp cho bạn một Listhậu thuẫn bởi một mảng, vì vậy nó không thể thay đổi độ dài.
Nhưng bạn có thể gọi List.set, vì vậy nó vẫn có thể thay đổi .


Bạn có thể thực hiện Arrays.asListthậm chí ngắn hơn với nhập tĩnh:

List<String> strings = asList("foo", "bar", "baz");

Nhập tĩnh:

import static java.util.Arrays.asList;  

Mà bất kỳ IDE hiện đại nào cũng sẽ gợi ý và tự động làm cho bạn.
Ví dụ trong IntelliJ IDEA bạn nhấn Alt+Entervà chọn Static import method....


Tuy nhiên, tôi không khuyên bạn nên rút ngắn List.ofphương thức này of, vì điều đó trở nên khó hiểu.
List.ofđã đủ ngắn và đọc tốt.


Sử dụng Streams

Tại sao nó phải là một List?
Với Java 8 trở lên, bạn có thể sử dụng một Streamcái linh hoạt hơn:

Stream<String> strings = Stream.of("foo", "bar", "baz");

Bạn có thể nối Streams:

Stream<String> strings = Stream.concat(Stream.of("foo", "bar"),
                                       Stream.of("baz", "qux"));

Hoặc bạn có thể đi từ a Streamđến a List:

import static java.util.stream.Collectors.toList;

List<String> strings = Stream.of("foo", "bar", "baz").collect(toList());

Nhưng tốt nhất, chỉ cần sử dụng Streammà không thu thập nó để a List.


Nếu bạn thực sự cần mộtjava.util.ArrayList

(Bạn có thể không.)
Để trích dẫn JEP 269 (nhấn mạnh của tôi):

Có một tập hợp nhỏ các trường hợp sử dụng để khởi tạo một thể hiện bộ sưu tập có thể thay đổi với một bộ giá trị được xác định trước. Thông thường, nên để các giá trị được xác định trước đó nằm trong một bộ sưu tập không thay đổi và sau đó khởi tạo bộ sưu tập có thể thay đổi thông qua một hàm tạo sao chép.


Nếu bạn muốn cả hai chuẩn bị trước ArrayList thêm vào sau đó (tại sao?), Hãy sử dụng

ArrayList<String> strings = new ArrayList<>(List.of("foo", "bar"));
strings.add("baz");

hoặc trong Java 8 trở về trước:

ArrayList<String> strings = new ArrayList<>(asList("foo", "bar"));
strings.add("baz");

hoặc sử dụng Stream:

import static java.util.stream.Collectors.toCollection;

ArrayList<String> strings = Stream.of("foo", "bar")
                             .collect(toCollection(ArrayList::new));
strings.add("baz");

Nhưng một lần nữa, tốt hơn là chỉ sử dụng Streamtrực tiếp thay vì thu thập nó cho a List.


Chương trình để giao diện, không triển khai

Bạn nói rằng bạn đã khai báo danh sách dưới dạng ArrayListmã trong mã của mình, nhưng bạn chỉ nên làm điều đó nếu bạn đang sử dụng một số thành viên ArrayListkhông có trong đó List.

Mà bạn rất có thể không làm.

Thông thường, bạn chỉ cần khai báo các biến bởi giao diện chung nhất mà bạn sẽ sử dụng (ví dụ Iterable, Collectionhay List), và khởi tạo chúng với việc thực hiện cụ thể (ví dụ ArrayList, LinkedListhoặc Arrays.asList()).

Mặt khác, bạn giới hạn mã của mình vào loại cụ thể đó và sẽ khó thay đổi hơn khi bạn muốn.

Ví dụ: nếu bạn chuyển một ArrayListđến void method(...):

// Iterable if you just need iteration, for (String s : strings):
void method(Iterable<String> strings) { 
    for (String s : strings) { ... } 
}

// Collection if you also need .size(), .isEmpty(), or .stream():
void method(Collection<String> strings) {
    if (!strings.isEmpty()) { strings.stream()... }
}

// List if you also need .get(index):
void method(List<String> strings) {
    strings.get(...)
}

// Don't declare a specific list implementation
// unless you're sure you need it:
void method(ArrayList<String> strings) {
    ??? // You don't want to limit yourself to just ArrayList
}

Một ví dụ khác sẽ luôn luôn khai báo biến số InputStreammặc dù nó thường là a FileInputStreamhoặc a BufferedInputStream, bởi vì một ngày nào đó bạn hoặc ai đó sẽ muốn sử dụng một số loại khác InputStream.


3
@jollyroger: Arrays.asListlà một phương thức tĩnh. Xem docs.oracle.com/javase/1.5.0/docs/guide/language/...
Christoffer Hammarström

2
@ Christoffer Hammarström Trong trường hợp đó, tâm trí người mới của tôi nói với tôi rằng nhập khẩu tĩnh có sự tương đồng mạnh mẽ với các biến toàn cầu và các hiểm họa liên quan đến việc sử dụng đó. Giả định này có đúng không và đó cũng là lý do cho câu trả lời tương tự ở trên nhận được nhiều phiếu hơn?
jollyroger

2
Câu trả lời ở trên tôi nghĩ bạn đang nói đến đã được thực hiện một năm trước. Và không, vấn đề với các biến toàn cầu là chúng có thể thay đổi. Họ không có gì để làm với nhập khẩu tĩnh.
Christoffer Hammarström

2
Nếu bạn không muốn nhập tĩnh, bạn cũng có thể xác định đường dẫn đầy đủ đến phương thức asList tĩnh, vì vậy: List <String> String = java.util.Arrays.asList ("", "");
Geert Weening

2
Hoặc bạn có thể sử dụng nhập java.util.Arrays; và Arrays.asList ("", ""); Bạn không phải sử dụng nhập tĩnh. Bạn không phải sử dụng một đường dẫn đầy đủ. Phương pháp tĩnh không quan tâm đến việc nhập khẩu. Họ chỉ cảm thấy khó chịu nếu bạn sử dụng một ví dụ để tìm thấy chúng.
candied_orange

111

Nếu bạn cần một danh sách đơn giản có kích thước 1:

List<String> strings = new ArrayList<String>(Collections.singletonList("A"));

Nếu bạn cần một danh sách một số đối tượng:

List<String> strings = new ArrayList<String>();
Collections.addAll(strings,"A","B","C","D");

57

Với quả ổi bạn có thể viết:

ArrayList<String> places = Lists.newArrayList("Buenos Aires", "Córdoba", "La Plata");

Trong ổi cũng có các hàm tạo tĩnh hữu ích khác. Bạn có thể đọc về họ ở đây .


1
Tôi khá chắc chắn rằng bạn có thể làm điều này chỉ với, java.util.Arrayschẳng hạn nhưList<String> names = Arrays.asList("Beckah", "Sam", "Michael");
beckah

2
Phương thức @beckah Arrays.asLists tạo đối tượng của Danh sách loại, trong khi câu hỏi là về việc tạo ArrayList
Paweł Adamski


34

Các bộ sưu tập theo nghĩa đen đã không đưa nó vào Java 8, nhưng có thể sử dụng API Stream để khởi tạo một danh sách trong một dòng khá dài:

List<String> places = Stream.of("Buenos Aires", "Córdoba", "La Plata").collect(Collectors.toList());

Nếu bạn cần đảm bảo rằng bạn ListArrayList:

ArrayList<String> places = Stream.of("Buenos Aires", "Córdoba", "La Plata").collect(Collectors.toCollection(ArrayList::new));

34

Với và ở trên, như được đề xuất trong JEP 269: Phương pháp nhà máy tiện lợi cho các bộ sưu tập , điều này có thể đạt được bằng cách sử dụng bộ sưu tập bằng chữ ngay bây giờ với -

List<String> list = List.of("A", "B", "C");

Set<String> set = Set.of("A", "B", "C");

Một cách tiếp cận tương tự cũng sẽ được áp dụng Map-

Map<String, String> map = Map.of("k1", "v1", "k2", "v2", "k3", "v3")

tương tự như đề xuất của Bộ sưu tập Văn học như được nêu bởi @coobird. Làm rõ thêm trong JEP là tốt -


Lựa chọn thay thế

Thay đổi ngôn ngữ đã được xem xét nhiều lần và bị từ chối:

Đề xuất dự án Coin, ngày 29 tháng 3 năm 2009

Đề xuất dự án tiền xu, ngày 30 tháng 3 năm 2009

Thảo luận JEP 186 về lambda-dev, tháng 1-2013

Các đề xuất ngôn ngữ được đặt sang một bên ưu tiên cho một đề xuất dựa trên thư viện như được tóm tắt trong thông báo này .

Liên quan: Điểm nào của Phương thức nhà máy tiện lợi quá tải cho các bộ sưu tập trong Java 9


31
import com.google.common.collect.ImmutableList;

....

List<String> places = ImmutableList.of("Buenos Aires", "Córdoba", "La Plata");

4
Tôi không muốn thêm một phụ thuộc mới chỉ để làm điều đó.
Maczzy

6
Điều đó giống như Collections.unmodifiableList(Arrays.asList("Buenos Aires", "Córdoba", "La Plata")), trở thành unmodifiableList(asList("Buenos Aires", "Córdoba", "La Plata"))với nhập khẩu tĩnh. Bạn không cần Bộ sưu tập Google cho việc này.
Christoffer Hammarström

9
Không, nó không giống nhau. Vì ImmutableList đang ghi lại tính bất biến của nó trong loại kết quả khi unmodifiableList giả mạo nó như một Danh sách bình thường.
David Pierre

2
Thay vì bất biến, các bộ sưu tập của google cũng cung cấp danh sách mảng có thể thay đổi: Danh sách <String> = Lists.newArrayList ("Buenos Aires", "Córdoba", "La Plata");
L. Holanda

3
Bạn sẽ chuyển nó ImmutableListsang các phương thức khác List, và sau đó bạn đã mất tài liệu đó.
Christoffer Hammarström

23

Bạn có thể tạo một phương thức nhà máy:

public static ArrayList<String> createArrayList(String ... elements) {
  ArrayList<String> list = new ArrayList<String>();
  for (String element : elements) {
    list.add(element);
  }
  return list;
}

....

ArrayList<String> places = createArrayList(
  "São Paulo", "Rio de Janeiro", "Brasília");

Nhưng nó không tốt hơn nhiều so với lần tái cấu trúc đầu tiên của bạn.

Để linh hoạt hơn, nó có thể chung chung:

public static <T> ArrayList<T> createArrayList(T ... elements) {
  ArrayList<T> list = new ArrayList<T>();
  for (T element : elements) {
    list.add(element);
  }
  return list;
}

1
Nhìn lại bài viết gốc, nó đang yêu cầu khởi tạo mảng trong một dòng chứ không phải 7 dòng bổ sung.
L. Holanda

7
@LeoHolanda: Tạo phương pháp nhà máy cho mọi thứ nhỏ là quá nhiều, tôi đồng ý. Nhưng tùy thuộc vào tình huống và số lần phương thức đó sẽ được sử dụng, việc tạo ra nó có thể có ý nghĩa. Tạo các lớp trừu tượng bổ sung có nghĩa là để loại bỏ sự phức tạp, bằng cách tạo ra các phương thức có ý nghĩa hơn để nắm bắt ý định của người thiết kế.
Jordão

16

Trong Java 9, chúng ta có thể dễ dàng khởi tạo một ArrayListdòng trong một dòng:

List<String> places = List.of("Buenos Aires", "Córdoba", "La Plata");

hoặc là

List<String> places = new ArrayList<>(List.of("Buenos Aires", "Córdoba", "La Plata"));

Cách tiếp cận mới này của Java 9 có nhiều ưu điểm so với các cách trước:

  1. Hiệu quả không gian
  2. Bất biến
  3. Chủ đề an toàn

Xem bài đăng này để biết thêm chi tiết -> Sự khác biệt giữa List.of và Arrays.asList là gì?


8

Về cách nhỏ gọn nhất để làm điều này là:

Double array[] = { 1.0, 2.0, 3.0};
List<Double> list = Arrays.asList(array);

8

Đơn giản chỉ cần sử dụng mã dưới đây như sau.

List<String> list = new ArrayList<String>() {{
            add("A");
            add("B");
            add("C");
}};

2
@bsd Bạn có thể sử dụng phương thức này để khai báo danh sách trước khi nhập bất kỳ phương thức nào. Vì vậy, khi xác định các biến lớp, nội dung có thể được thêm vào danh sách mà không cần phải gọi một phương thức để làm như vậy.
melwil

2
khởi tạo niềng răng đôi nên tránh càng xa càng tốt. xem: stackoverflow.com/a/924326/760393
Raúl

8

Với Bộ sưu tập Eclipse, bạn có thể viết như sau:

List<String> list = Lists.mutable.with("Buenos Aires", "Córdoba", "La Plata");

Bạn cũng có thể cụ thể hơn về các loại và liệu chúng là Mutable hay bất biến.

MutableList<String> mList = Lists.mutable.with("Buenos Aires", "Córdoba", "La Plata");
ImmutableList<String> iList = Lists.immutable.with("Buenos Aires", "Córdoba", "La Plata");

Bạn cũng có thể làm tương tự với Bộ và Túi:

Set<String> set = Sets.mutable.with("Buenos Aires", "Córdoba", "La Plata");
MutableSet<String> mSet = Sets.mutable.with("Buenos Aires", "Córdoba", "La Plata");
ImmutableSet<String> iSet = Sets.immutable.with("Buenos Aires", "Córdoba", "La Plata");

Bag<String> bag = Bags.mutable.with("Buenos Aires", "Córdoba", "La Plata");
MutableBag<String> mBag = Bags.mutable.with("Buenos Aires", "Córdoba", "La Plata");
ImmutableBag<String> iBag = Bags.immutable.with("Buenos Aires", "Córdoba", "La Plata");

Lưu ý: Tôi là người đi làm cho Bộ sưu tập Eclipse.


7

Đây là một cách khác:

List<String> values = Stream.of("One", "Two").collect(Collectors.toList());

7

(Nên là một bình luận, nhưng quá dài, nên mới trả lời). Như những người khác đã đề cập, Arrays.asListphương pháp có kích thước cố định, nhưng đó không phải là vấn đề duy nhất với nó. Nó cũng không xử lý thừa kế rất tốt. Ví dụ: giả sử bạn có những điều sau đây:

class A{}
class B extends A{}

public List<A> getAList(){
    return Arrays.asList(new B());
}

Các kết quả trên gây ra lỗi trình biên dịch, bởi vì List<B>(đó là những gì được Arrays.asList trả về) không phải là một lớp con của List<A>, mặc dù bạn có thể thêm các Đối tượng loại B vào một List<A>đối tượng. Để giải quyết vấn đề này, bạn cần làm một cái gì đó như:

new ArrayList<A>(Arrays.<A>asList(b1, b2, b3))

Đây có lẽ là cách tốt nhất để làm điều này, đặc biệt. nếu bạn cần một danh sách không giới hạn hoặc cần sử dụng kế thừa.


6

Bạn có thể sử dụng các tuyên bố dưới đây:

Đoạn mã:

String [] arr = {"Sharlock", "Homes", "Watson"};

List<String> names = Arrays.asList(arr);

Bạn có thể nội tuyến biểu thức đầu tiên để có giải pháp nhỏ gọn:letters = Arrays.asList(new String[]{"A", "B", "C"});
Pavel Repin

5

Giống như Tom đã nói :

List<String> places = Arrays.asList("Buenos Aires", "Córdoba", "La Plata");

Nhưng vì bạn phàn nàn về việc muốn có ArrayList, trước tiên bạn nên biết rằng ArrayList là một lớp con của Danh sách và bạn chỉ cần thêm dòng này:

ArrayList<String> myPlaces = new ArrayList(places);

Mặc dù, điều đó có thể khiến bạn phàn nàn về 'hiệu suất'.

Trong trường hợp đó, nó không có ý nghĩa với tôi, tại sao, vì danh sách của bạn được xác định trước nên nó không được định nghĩa là một mảng (vì kích thước được biết tại thời điểm khởi tạo). Và nếu đó là một lựa chọn cho bạn:

String[] places = {"Buenos Aires", "Córdoba", "La Plata"};

Trong trường hợp bạn không quan tâm đến sự khác biệt hiệu năng nhỏ thì bạn cũng có thể sao chép một mảng vào ArrayList rất đơn giản:

ArrayList<String> myPlaces = new ArrayList(Arrays.asList(places));

Được rồi, nhưng trong tương lai bạn cần nhiều hơn một chút so với tên địa danh, bạn cũng cần một mã quốc gia. Giả sử đây vẫn là một danh sách được xác định trước sẽ không bao giờ thay đổi trong thời gian chạy, thì nó phù hợp để sử dụng một enumbộ, sẽ yêu cầu biên dịch lại nếu danh sách cần thay đổi trong tương lai.

enum Places {BUENOS_AIRES, CORDOBA, LA_PLATA}

sẽ trở thành:

enum Places {
    BUENOS_AIRES("Buenos Aires",123),
    CORDOBA("Córdoba",456),
    LA_PLATA("La Plata",789);

    String name;
    int code;
    Places(String name, int code) {
      this.name=name;
      this.code=code;
    }
}

Enum có một valuesphương thức tĩnh trả về một mảng chứa tất cả các giá trị của enum theo thứ tự chúng được khai báo, ví dụ:

for (Places p:Places.values()) {
    System.out.printf("The place %s has code %d%n",
                  p.name, p.code);
}

Trong trường hợp đó tôi đoán bạn sẽ không cần ArrayList của bạn.

PS Randyaa đã trình diễn một cách hay khác bằng cách sử dụng phương thức tiện ích tĩnh Collections.add ALL .


5

Java 9 có phương thức sau để tạo một danh sách bất biến :

List<String> places = List.of("Buenos Aires", "Córdoba", "La Plata");

dễ dàng điều chỉnh để tạo danh sách có thể thay đổi, nếu cần:

List<String> places = new ArrayList<>(List.of("Buenos Aires", "Córdoba", "La Plata"));

Phương pháp tương tự có sẵn cho SetMap.


1
Thật tốt khi bạn nói rõ ràng "danh sách bất biến" và sau đó đưa ra một ví dụ khác về danh sách có thể thay đổi bởi vì nó cho biết rõ nên sử dụng khi nào.
trân trọng


4

Có với sự trợ giúp của Mảng, bạn có thể khởi tạo danh sách mảng trong một dòng,

List<String> strlist= Arrays.asList("aaa", "bbb", "ccc");

4

Bạn có thể sử dụng StickyListtừ Cactoos :

List<String> names = new StickyList<>(
  "Scott Fitzgerald", "Fyodor Dostoyevsky"
);

3

Hãy thử với dòng mã này:

Collections.singletonList(provider)

1
Thêm một mô tả ngắn gọn về câu trả lời của bạn.
Morales Batovski

2

Trong Java, bạn không thể làm

ArrayList<String> places = new ArrayList<String>( Arrays.asList("Buenos Aires", "Córdoba", "La Plata"));

Như đã chỉ ra, bạn cần thực hiện khởi tạo cú đúp:

List<String> places = new ArrayList<String>() {{ add("x"); add("y"); }};

Nhưng điều này có thể buộc bạn thêm chú thích @SuppressWarnings("serial")hoặc tạo UUID nối tiếp gây phiền nhiễu. Ngoài ra, hầu hết các trình định dạng mã sẽ mở khóa thành nhiều câu lệnh / dòng.

Ngoài ra, bạn có thể làm

List<String> places = Arrays.asList(new String[] {"x", "y" });

nhưng sau đó bạn có thể muốn làm a @SuppressWarnings("unchecked").

Cũng theo javadoc, bạn sẽ có thể làm điều này:

List<String> stooges = Arrays.asList("Larry", "Moe", "Curly");

Nhưng tôi không thể biên dịch nó với JDK 1.6.


5
Sai lầm! Bạn có thể thực hiện dòng đầu tiên, và đó là câu trả lời đúng btw
Bohemian

1
Collections.singletonList(messageBody)

Nếu bạn cần có một danh sách một mặt hàng !

Bộ sưu tập là từ gói java.util .


1

Cách tốt nhất để làm điều đó:

package main_package;

import java.util.ArrayList;


public class Stackkkk {
    public static void main(String[] args) {
        ArrayList<Object> list = new ArrayList<Object>();
        add(list, "1", "2", "3", "4", "5", "6");
        System.out.println("I added " + list.size() + " element in one line");
    }

    public static void add(ArrayList<Object> list,Object...objects){
        for(Object object:objects)
            list.add(object);
    }
}

Chỉ cần tạo một hàm có thể có nhiều phần tử như bạn muốn và gọi nó để thêm chúng vào một dòng.


1
Nếu bạn trải qua tất cả các rắc rối, bạn cũng có thể biến nó thành một phương thức mẫu thay vì sử dụng đơn giản Object.
Robert

1

Đây là mã của AbacusUtil

// ArrayList
List<String> list = N.asList("Buenos Aires", "Córdoba", "La Plata");
// HashSet
Set<String> set = N.asSet("Buenos Aires", "Córdoba", "La Plata");
// HashMap
Map<String, Integer> map = N.asMap("Buenos Aires", 1, "Córdoba", 2, "La Plata", 3);

// Or for Immutable List/Set/Map
ImmutableList.of("Buenos Aires", "Córdoba", "La Plata");
ImmutableSet.of("Buenos Aires", "Córdoba", "La Plata");
ImmutableSet.of("Buenos Aires", 1, "Córdoba", 2, "La Plata", 3);

// The most efficient way, which is similar with Arrays.asList(...) in JDK. 
// but returns a flexible-size list backed by the specified array.
List<String> set = Array.asList("Buenos Aires", "Córdoba", "La Plata");

Tuyên bố tôi là nhà phát triển của AbacusUtil.


0

Đối với tôi Arrays.asList () là cái tốt nhất và tiện lợi. Tôi luôn thích khởi tạo theo cách đó. Nếu bạn là người mới bắt đầu vào Bộ sưu tập Java thì tôi muốn bạn tham khảo khởi tạo ArrayList


Tại sao Arrays.asList () tốt hơn việc tạo một ArrayList mới trong một dòng với add()các phương thức?
IgorGanapolsky

0

Tại sao không làm một chức năng tiện ích đơn giản mà làm điều này?

static <A> ArrayList<A> ll(A... a) {
  ArrayList l = new ArrayList(a.length);
  for (A x : a) l.add(x);
  return l;
}

" ll" là viết tắt của "danh sách theo nghĩa đen".

ArrayList<String> places = ll("Buenos Aires", "Córdoba", "La Plata");

0

thú vị là không có một lớp lót với phương pháp quá tải khác Stream::collect được liệt kê

ArrayList<String> places = Stream.of( "Buenos Aires", "Córdoba", "La Plata" ).collect( ArrayList::new, ArrayList::add, ArrayList::addAll );

-1

Trên thực tế, có thể làm điều đó trong một dòng:

Arrays.asList(new MyClass[] {new MyClass("arg1"), new MyClass("arg2")})

3
Tôi có thể hỏi những gì điều này thêm vào câu hỏi? Câu trả lời này đã được bao phủ nhiều lần bởi các câu trả lời khác.
Bí ẩn

Đây thực sự là một giải pháp thực sự tồi tệ vì nó tạo ra một DANH SÁCH TÓM TẮT. Bạn sẽ không thể thêm bất cứ thứ gì vào container.
Atais
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.