2009-07-20 22 views
463

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

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

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

+2

Một IDE hỗ trợ tái bao thanh toán sẽ cho phép bạn In- dòng strs tự động. –

Trả lời

734
m(new String[]{"blah", "hey", "yo"}); 
+43

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 "Anonymous array java" sẽ tạo ra một số kết quả. – Falaina

+1

Nó giống như đúc. Tôi nghĩ rằng đó là cách tôi sẽ 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

91

Draemon là chính xác. Bạn cũng có thể tuyên bố m như chụp 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 
+12

cú pháp khá đẹp, nhưng với phương pháp này bạn chỉ có thể có một tham số mảng và nó phải là một tham số cuối cùng. Vì vậy, bạn không thể làm: 'void m (String ... strs, Integer ... intgrs)' chẳng hạn. – bluefoot

+5

blefoot là đúng. Nhưng bạn có thể làm 'void m (Integer i, Double d, String ... str)' –

+0

@MichaelMyers Ý nghĩa của '(Chuỗi ... strs)' –

2

tôi muốn thêm rằng cú pháp mảng khởi tạo là rất gọn gàng 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 tôi và đặt nó ở đâu đó dễ sử dụng hơn.

menu Như một ví dụ, tôi đã thường xuyên tạo ra như thế này:

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

này sẽ cho phép tôi viết đến mã để thiết lập một hệ thống menu. Dấu "+" là đủ để yêu cầu nó đặt mục đó trong mục trước đó.

Tôi có thể liên kết nó với menuHandler class theo quy ước đặt tên phương thức bằng cách đặt tên cho 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ó các lựa chọn thay thế khác).

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

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

+4

Điều này cũng thích hợp hơn để làm như varargs. Ngoài ra, bất cứ ai thích gõ mã ra cho "vui" xứng đáng là một downvote! Mã hóa là giải quyết các vấn đề mới, không phải gõ. Oh chờ đợ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 nhiều varargs - và tôi đã sử dụng khởi tạo mảng khá nhiều trước khi varargs tồn tại trong java. Một phần mà tôi vẫn thích mảng là nếu bạn định nghĩa nó như 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ể giải nén nó vào một tệp cấu hình –

+0

Nhân tiện , 8 năm sau, tôi phải nói rằng bây giờ tôi tìm thấy bản thân mình bằng cách sử dụng 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. –

1

Như Draemon nói, gần nhất mà Java nói đến nội tuyến mảng là new String[]{"blah", "hey", "yo"} tuy nhiên có một trick gọn gàng cho phép bạn làm điều 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 cường ngôn ngữ Java để cho phép các mảng nội tuyến và các loại bộ sưu tập. Để biết thêm chi tiết google dự án Espresso4J hoặc check it out here

+7

Chỉ cần một vài vấn đề ở đây: 1. Hãy đảm bảo rằng trong bài đăng và hồ sơ của bạn, bạn hiểu rõ rằng bạn được liên kết với Espresso4J (vui lòng xem [Khuyến mại # FAQ] của chúng tôi) 2. Hãy cẩn thận đăng các liên kết tới trang web của riêng bạn trên các bài đăng khá cũ (đặc biệt là các câu trả lời soạn sẵn như thế này và [bài này] (http://stackoverflow.com/questions/1473868/why-cant-i-create-a-new-java-array-inline/7300580#7300580)) - nó đi ra như rất spam và tăng cờ mà sẽ dent đại diện của bạn. – Kev

+0

@Kev ah xin lỗi. Tôi đã làm rõ rằng tôi là nhà phát triển của dự án Espresso4J tinh tế bây giờ :) –

20

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

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

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

+1

Vâng !!! = D Và chỉ cần nhớ, mảng được tạo ra theo cách này, là bất biến. –

+2

Điểm hữu ích có thể có: Bạn không thể làm điều này với nguyên thủy. Bạn sẽ kết thúc với một phần tử 'List' của' type [] 'trong đó' type' là nguyên thủy. ví dụ. 'Arrays.asList ([some ints])' kết quả trong một 'Danh sách '. – Moira

3

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

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

sau đó sử dụng nó

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

cho cái nhìn tốt hơn.

1

Bây giờ bạn có thể ghi trực tiếp mảng trong Java hiện đại, không cần bộ khởi tạo. Ví dụ của bạn bây giờ là hợp lệ.

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

hoặc

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

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

ArrayUtils.toArray("elem1","elem2") 
Các vấn đề liên quan