কোনও রেখাটি ইন-লাইন ঘোষণার জন্য কীভাবে?


616

ধরা যাক আমার কাছে একটি পদ্ধতি মি () রয়েছে যা যুক্তি হিসাবে স্ট্রিংয়ের অ্যারে নেয়। আমি কল করার সময় আমি কী এই উপায়টি কেবল অনলাইনেই অনলাইনে ঘোষণা করতে পারি? এর পরিবর্তে:

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

আমি কি কেবল একটি লাইনের সাথে এটি প্রতিস্থাপন করতে পারি এবং কোনও নামযুক্ত ভেরিয়েবল ঘোষণা করা এড়াতে পারি যা আমি কখনই ব্যবহার করব না?


2
একটি আইডিই যা পুনঃ-ফ্যাক্টরিং সমর্থন করে তা আপনাকে স্বয়ংক্রিয়ভাবে ইন-লাইন স্টারগুলিকে অনুমতি দেবে।
পল ম্যাকেনজি

উত্তর:


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

77
কেবল ভবিষ্যতের রেফারেন্সের জন্য, এই ধরণের অ্যারেটি বেনামে অ্যারে হিসাবে পরিচিত (কারণ এটির কোনও নাম নেই)। "বেনামে অ্যারে জাভা" অনুসন্ধান করলে কিছু ফলাফল পাওয়া যেত।
ফালাইনা

2
এটি ingালাইয়ের অনুরূপ। আমি মনে করি এটি আমি কীভাবে এটি ভাবব তাই ব্লুমুনে একবারে এটি করার দরকার নেই।
আর্টঅফ ওয়ারফেয়ার

এটি এমন বিরল উদাহরণ যেখানে কোনও কোড-উত্তর উত্তর সম্পূর্ণ গ্রহণযোগ্য এবং বাস্তবে সম্ভবত এটি আরও পছন্দসই।
ম্যাক্স ভন হিপ্পেল

113

ড্রিমন ঠিক আছে। আপনি ভারার্গসm গ্রহণ হিসাবেও ঘোষণা করতে পারেন :

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
বেশ সুন্দর বাক্য গঠন, তবে এই পদ্ধতির সাহায্যে আপনার কেবলমাত্র একটি অ্যারে প্যারামিটার থাকতে পারে এবং এটি অবশ্যই শেষটি হওয়া উচিত। সুতরাং, আপনি এটি করতে পারবেন না: void m(String... strs, Integer... intgrs)উদাহরণস্বরূপ।
ব্লুফুট

5
ব্লাফুট ঠিক আছে। তবে আপনি এটি করতে পারেনvoid m(Integer i, Double d, String... str)
ইগোর এস।


1
@ কাসুনসিয়াম্বলপিতিয়া: আমার উত্তরের লিঙ্কটি ক্লিক করুন।
মাইকেল মায়ার্স

30

এটি করার আরেকটি উপায়, আপনি যদি তালিকাটি ইনলাইন হিসাবে ফলাফল চান, আপনি এটি এটি করতে পারেন:

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

38
আপনার আসলে কোনও অ্যারে তৈরি করার দরকার নেই, আপনি সহজভাবে এটি করতে পারেন:Arrays.asList("string1", "string2", ...)
এলিয়াস ডরনেলেস

2
সম্ভবত দরকারী পয়েন্ট: আপনি আদিম দিয়ে এটি করতে পারবেন না। আপনি একটি একক-উপাদানের দিয়ে শেষ করব Listএর type[]যেখানে typeযে আদিম হয়। যেমন Arrays.asList([some ints])একটি ফলাফল List<int[]>
মাইরা

@ অ্যান্টোনিও কার্লোস: না, তা হয় না। আপনি setফিরে এসে কল করতে পারেন Listএবং এটি অ্যারে সংশোধন করবে।
হলগার

17

আপনি সরাসরি কোনও ইনিশিয়ালাইজার ছাড়াই আধুনিক জাভাতে অ্যারে লিখতে পারেন। আপনার উদাহরণটি এখন বৈধ। সাধারণত প্যারামিটারটির নাম দেওয়া ভাল।

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

অথবা

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

আপনি যদি আছে ইনলাইন জন্য, আপনাকে টাইপ ডিক্লেয়ার করতে হবে:

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

বা ভেরাগস (পরিবর্তনশীল আর্গুমেন্ট) ব্যবহার করুন

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

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

আশা করা যায় জাভা এর বিকাশকারীরা ভবিষ্যতে অন্তর্নিহিত আরম্ভের অনুমতি দেবে

আপডেট: কোটলিন উত্তর

কোটলিন অ্যারে দিয়ে কাজ করা এত সহজ করে দিয়েছে! বেশিরভাগ প্রকারের জন্য, কেবল ব্যবহার করুন arrayOfএবং এটি স্পষ্টভাবে প্রকারটি নির্ধারণ করবে। এগুলি খালি রাখার জন্য কিছুই পাস করবেন না।

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

আদিমদের ইউটিলিটি ফাংশন রয়েছে। এগুলি খালি রাখার জন্য কিছুই পাস করবেন না।

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

আপনার যদি ইতিমধ্যে একটি থাকে Collectionএবং এটিকে একটি অ্যারে ইনলাইন রূপান্তর করতে চান তবে সহজভাবে ব্যবহার করুন:

collection.toTypedArray()

আপনার যদি অ্যারে প্রকারের জোর করা প্রয়োজন, ব্যবহার করুন:

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

তবে আপনি পারবেন না doSomething({"blah", "hey", "yo"}), যা মূল প্রশ্নটি সম্পর্কে জিজ্ঞাসা করেছিল।
ডেভিড ডিমার

11

আপনি কোথাও একটি পদ্ধতি তৈরি করতে পারেন

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

তারপরে এটি ব্যবহার করুন

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

আরও ভাল চেহারা জন্য।


3

আমি যুক্ত করতে চাই যে অ্যারের প্রারম্ভিক বাক্য গঠনটি খুব সংক্ষিপ্ত এবং নমনীয়। আমি আমার কোড থেকে ডেটা বের করতে এবং এটি আরও কোথাও ব্যবহারযোগ্য করে রাখার জন্য এটি প্রচুর ব্যবহার করি।

উদাহরণ হিসাবে, আমি প্রায়শই এই জাতীয় মেনু তৈরি করেছি:

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

এটি আমাকে মেনু সিস্টেম সেট আপ করার জন্য কোড কোড লেখার অনুমতি দেবে। "আইটেমটি পূর্ববর্তী আইটেমের নীচে সেই আইটেমটি রাখার জন্য এটি বলার জন্য যথেষ্ট।

আমি মেন্যু হ্যান্ডলার শ্রেণিতে একটি পদ্ধতি নামকরণের মাধ্যমে আমার পদ্ধতিগুলিকে "মেনু ফাইল, মেনুফিলস্যাভ, মেনুফিললয়েড, ..." এর মতো নামকরণ করে এবং প্রতিফলিতভাবে বাঁধাই করতে পারি (অন্যান্য বিকল্প রয়েছে)।

এই বাক্য গঠনটি অ্যামেজিংয়ে সংক্ষিপ্ত মেনু সংজ্ঞা এবং একটি অত্যন্ত পুনঃব্যবহারযোগ্য "initMenus" পদ্ধতিটিকে মঞ্জুরি দেয়। (তবুও আমি এটি পুনঃব্যবহার করতে বিরক্ত করি না কারণ এটি লিখতে সর্বদা মজাদার এবং কয়েক মিনিট + কোডের কয়েক লাইন লাগে)।

আপনি যখনই আপনার কোডটিতে কোনও প্যাটার্ন দেখেন, দেখুন আপনি এটির মতো কোনও কিছু দিয়ে এটি প্রতিস্থাপন করতে পারেন কিনা এবং সর্বদা মনে রাখবেন অ্যারে প্রারম্ভিককরণ সিনট্যাক্সটি কতটা সংহত হয় !.


5
এটি ভারার্গস হিসাবে করা ভাল। এছাড়াও, যে কেউ "মজাদার" জন্য টাইপিং কোড পছন্দ করে সে ডাউনটাউটের যোগ্য! কোডিং টাইপ নয়, নতুন সমস্যা সমাধানের বিষয়ে। ওহ অপেক্ষা করুন, এটি জাভা ;-)
mjaggard

1
আপনি ঠিক বলেছেন, আমি যখন এটি লিখেছিলাম তখন আমি ভ্যারেগগুলি খুব বেশি ব্যবহার করি নি - এবং জাভাতে ভারার্গ্সের অস্তিত্বের আগে আমি অ্যারে ইনিশিয়েশন ব্যবহার করি। যে অংশটির জন্য আমি অ্যারেগুলিকে এখনও পছন্দ করি তা হ'ল আপনি যদি এটিকে আরে হিসাবে সংজ্ঞায়িত করেন তবে আপনি এটিকে ইনলাইন ডেটার পরিবর্তে ফাইলের শীর্ষে একটি ধ্রুবক তৈরি করতে পারেন, এবং আপনি এটি একটি কনফিগার ফাইলেও বের করতে পারবেন
বিল কে

যাইহোক, 8 বছর পরে আমাকে বলতে হবে যে আমি এখন প্রাথমিকভাবে স্ট্রিং অ্যারে ব্যবহার করার জন্য ব্যবহৃত প্রায় সমস্ত জিনিস করতে টীকা ব্যবহার করে নিজেকে খুঁজে পাই।
বিল কে

2

Org.apache.commons.lang3 এ অ্যারে ইউটিলস. টুআর্রে ব্যবহার করা অন্য বিকল্প

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

এটি একটি বিকল্প, তবে এটিতে স্ট্যাকটিতে অতিরিক্ত ফাংশনাল কল যুক্ত রয়েছে যা অপ্রয়োজনীয়।
সাইবেএক্স

1

যেমন ড্রিমোন বলেছে, জাভা ইনলাইন অ্যারেগুলির নিকটতম আসে new String[]{"blah", "hey", "yo"}তবে এটি একটি ঝরঝরে কৌশল যা আপনাকে এর মতো কিছু করতে দেয়

array("blah", "hey", "yo") টাইপ সহ স্বয়ংক্রিয়ভাবে অনুমিত হয়।

আমি ইনলাইন অ্যারে এবং সংগ্রহের ধরণের জন্য জাভা ভাষা বাড়ানোর জন্য একটি দরকারী এপিআই-তে কাজ করছি। আরও তথ্যের জন্য গুগল প্রকল্প এসপ্রেসো 4 জে বা এটি এখানে দেখুন


9
এখানে কেবল কয়েকটি সমস্যা রয়েছে: ১. আপনার পোস্ট এবং প্রোফাইলে আপনি এপ্রেসো ৪ জে এর সাথে সম্পৃক্ত রয়েছেন তা নিশ্চিত করে নিশ্চিত করুন (দয়া করে আমাদের প্রায়শই জিজ্ঞাসিত প্রশ্নাবলী দেখুন ) ২. আপনার নিজের ওয়েবসাইটে লিঙ্কগুলি বেশ পুরানো পোস্টগুলিতে পোস্ট করার ক্ষেত্রে সতর্ক থাকুন ( এই এক মত বিশেষত boilerplate, উত্তর এই এক ) - এটা খুব স্প্যামযুক্ত হিসাবে এসে পতাকা যা আপনার প্রতিনিধির ক্ষুন্ন হবে হবে উত্থাপন।
কেভ

@ কেভ আহ দুঃখিত আমি স্পষ্ট করে দিয়েছি যে আমি এখনই জরিমানা এসপ্রেসো
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.