Bất kỳ cách nào để khai báo một mảng trong dòng?


617

Giả sử tôi có một phương thức m () lấy một chuỗi các Chuỗi làm đối số. Có cách nào để tôi có thể khai báo mảng này trong dòng khi tôi thực hiện cuộc gọi không? tức là thay vì:

String[] strs = {"blah", "hey", "yo"};
m(strs);

Tôi chỉ có thể thay thế điều này bằng một dòng và tránh khai báo một biến có tên mà tôi sẽ không bao giờ sử dụng?


2
Một IDE hỗ trợ bao thanh toán lại sẽ cho phép bạn tự động xếp hàng.
Paul McKenzie

Câu trả lời:


945
m(new String[]{"blah", "hey", "yo"});

77
Chỉ để tham khảo trong tương lai, loại mảng này được gọi là mảng ẩn danh (vì nó không có tên). tìm kiếm "java mảng ẩn danh" sẽ tạo ra một số kết quả.
Falaina

2
Nó giống như đúc. Tôi nghĩ đó là cách tôi nghĩ về nó vì vậy tôi không phải google nó một lần trong một bluemoon tôi cần phải làm điều này.
ArtOfWarfare

Đây là trường hợp hiếm hoi mà câu trả lời chỉ có mã là hoàn toàn có thể chấp nhận được và trên thực tế, thậm chí có thể thích hợp hơn.
Max von Hippel

113

Draemon là chính xác. Bạn cũng có thể khai báo mlà dùng varargs :

void m(String... strs) {
    // strs is seen as a normal String[] inside the method
}

m("blah", "hey", "yo"); // no [] or {} needed; each string is a separate arg here

19
Cú pháp khá hay, nhưng với phương thức này, bạn có thể chỉ có một tham số mảng và nó phải là tham số cuối cùng. Vì vậy, bạn không thể làm: void m(String... strs, Integer... intgrs)ví dụ.
bluefoot

5
chân là đúng. Nhưng bạn có thể làmvoid m(Integer i, Double d, String... str)
Igor S.

@MichaelMyer Ý nghĩa của(String ... strs)
Kasun Siyambalapitiya

1
@KasunSiyambalapitiya: Nhấp vào liên kết trong câu trả lời của tôi.
Michael Myers

30

Một cách khác để làm điều đó, nếu bạn muốn kết quả dưới dạng Danh sách nội tuyến, bạn có thể làm như thế này:

Arrays.asList(new String[] { "String1", "string2" });

38
bạn thực sự không cần phải tạo một mảng, bạn có thể làm một cách đơn giản:Arrays.asList("string1", "string2", ...)
Elias Dornele

2
Điểm có thể hữu ích: Bạn không thể làm điều này với người nguyên thủy. Bạn sẽ kết thúc với một yếu tố duy nhất Listcủa type[]nơi typelà nguyên thủy. ví dụ Arrays.asList([some ints])kết quả trong a List<int[]>.
Moira

@Antonio Carlos: không, không phải vậy. Bạn có thể gọi settrả về Listvà nó sẽ sửa đổi mảng.
Holger

17

Bạn có thể trực tiếp viết mảng trong Java hiện đại mà không cần trình khởi tạo. Ví dụ của bạn bây giờ là hợp lệ. Nói chung, tốt nhất là đặt tên cho tham số.

String[] array = {"blah", "hey", "yo"};

hoặc là

int[] array = {1, 2, 3};

Nếu bạn phải nội tuyến, bạn sẽ cần khai báo loại:

functionCall(new String[]{"blah", "hey", "yo"});

hoặc sử dụng varargs (đối số biến)

void functionCall(String...stringArray) {
    // Becomes a String[] containing any number of items or empty
}

functionCall("blah", "hey", "yo");

Hy vọng các nhà phát triển của Java sẽ cho phép khởi tạo ngầm trong tương lai

Cập nhật: Trả lời của Kotlin

Kotlin đã làm việc với các mảng dễ dàng hơn nhiều! Đối với hầu hết các loại, chỉ cần sử dụng arrayOfvà nó sẽ ngầm xác định loại. Không có gì để bỏ trống.

arrayOf("1", "2", "3") // String
arrayOf(1, 2, 3)       // Int
arrayOf(1, 2, "foo")   // Any 
arrayOf<Int>(1, 2, 3)  // Set explict type
arrayOf<String>()      // Empty String array

Nguyên thủy có chức năng tiện ích. Không có gì để bỏ trống.

intArrayOf(1, 2, 3)
charArrayOf()
booleanArrayOf()
longArrayOf()
shortArrayOf()
byteArrayOf()

Nếu bạn đã có Collectionvà muốn chuyển đổi nó thành một mảng nội tuyến, chỉ cần sử dụng:

collection.toTypedArray()

Nếu bạn cần ép buộc một kiểu mảng, hãy sử dụng:

array.toIntArray()
array.toLongArray()
array.toCharArray()
...

Nhưng bạn không thể làm doSomething({"blah", "hey", "yo"}), đó là những gì câu hỏi ban đầu đã hỏi về.
David DeMar 17/03/18

11

Bạn có thể tạo một phương thức ở đâu đó

public static <T> T[] toArray(T... ts) {
    return ts;
}

sau đó sử dụng nó

m(toArray("blah", "hey", "yo"));

để nhìn tốt hơn


3

Tôi muốn thêm rằng cú pháp khởi tạo mảng rất ngắn gọn và linh hoạt. Tôi sử dụng nó rất nhiều để trích xuất dữ liệu từ mã của mình và đặt nó ở đâu đó có thể sử dụng nhiều hơn.

Ví dụ, tôi thường tạo các menu như thế này:

Menu menu=initMenus(menuHandler, new String[]{"File", "+Save", "+Load", "Edit", "+Copy", ...});

Điều này sẽ cho phép tôi viết mã đến để thiết lập một hệ thống menu. "+" Là đủ để bảo nó đặt vật phẩm đó dưới vật phẩm trước đó.

Tôi có thể liên kết nó với lớp menuHandler bằng cách quy ước đặt tên phương thức bằng cách đặt tên các phương thức của tôi như "menuFile, menuFileSave, menuFileLoad, ..." và ràng buộc chúng một cách phản xạ (có những cách khác).

Cú pháp này cho phép định nghĩa menu ngắn gọn TUYỆT VỜI và một phương thức "initMenus" cực kỳ tái sử dụng. (Tuy nhiên, tôi không bận tâm đến việc sử dụng lại vì nó luôn thú vị để viết và chỉ mất vài phút + một vài dòng mã).

bất cứ khi nào bạn nhìn thấy một mẫu trong mã của mình, hãy xem liệu bạn có thể thay thế nó bằng một cái gì đó như thế này không và luôn nhớ cú pháp khởi tạo mảng ngắn gọn như thế nào!.


5
Điều này cũng sẽ được ưa thích để làm varargs. Ngoài ra, bất cứ ai thích gõ mã cho "vui vẻ" đều đáng bị hạ bệ! Viết mã là để giải quyết các vấn đề mới, không phải gõ. Đợi đã, đây là Java ;-)
mjaggard

1
Bạn nói đúng, khi tôi viết bài này tôi đã không sử dụng varargs nhiều - và tôi đã sử dụng khởi tạo mảng khá nhiều trước khi vararg tồn tại trong java. Một phần tôi vẫn thích mảng hơn là nếu bạn xác định nó là một aray, bạn có thể biến nó thành một hằng số ở đầu tệp thay vì dữ liệu nội tuyến và bạn cũng có thể trích xuất nó thành tệp cấu hình
Bill K

Nhân tiện, 8 năm sau tôi phải nói rằng bây giờ tôi thấy mình sử dụng các chú thích để làm gần như tất cả những điều mà tôi đã sử dụng để sử dụng mảng chuỗi khởi tạo cho.
Bill K

2

Tùy chọn khác là sử dụng ArrayUtils.toArray trong org.apache.commons.lang3

ArrayUtils.toArray("elem1","elem2")

Nó là một sự thay thế, tuy nhiên nó có các cuộc gọi chức năng bổ sung thêm vào ngăn xếp không cần thiết.
CybeX

1

Như Draemon nói, cách gần nhất mà Java đến với các mảng nội tuyến là new String[]{"blah", "hey", "yo"}tuy nhiên có một thủ thuật gọn gàng cho phép bạn làm một cái gì đó như

array("blah", "hey", "yo") với loại tự động suy ra.

Tôi đã làm việc trên một API hữu ích để tăng ngôn ngữ Java để cho phép các mảng và các kiểu bộ sưu tập nội tuyến. Để biết thêm chi tiết google dự án Espresso4J hoặc xem tại đây


9
Chỉ có một vài vấn đề ở đây: 1. Hãy đảm bảo rằng trong các bài đăng và hồ sơ của bạn, bạn phải nói rõ rằng bạn đang liên kết với Espresso4J (vui lòng xem Câu hỏi thường gặp của chúng tôi ) 2. Hãy cẩn thận đăng liên kết đến trang web của riêng bạn trên các bài đăng khá cũ ( câu trả lời đặc biệt là soạn sẵn như thế này và cái này ) - nói tắt như rất spam và tăng cờ mà sẽ làm sứt mẻ đại diện của bạn.
Kev

@Kev ah xin lỗi. Tôi đã làm rõ rằng bây giờ tôi là nhà phát triển của dự án Espresso4J tuyệt vời :)
Jonathan Weatherhead
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.