আমি সম্প্রতি জাভা ৮-তে প্রবর্তিত ল্যাম্বডা এক্সপ্রেশনটি আয়ত্ত করে ফেলেছি I
এটি কি ভাল অনুশীলন হিসাবে বিবেচিত হয়? বা তাদের পরিস্থিতি যেখানে কার্যকরী ইন্টারফেসের জন্য লাম্বদা ব্যবহার করা উপযুক্ত নয়?
আমি সম্প্রতি জাভা ৮-তে প্রবর্তিত ল্যাম্বডা এক্সপ্রেশনটি আয়ত্ত করে ফেলেছি I
এটি কি ভাল অনুশীলন হিসাবে বিবেচিত হয়? বা তাদের পরিস্থিতি যেখানে কার্যকরী ইন্টারফেসের জন্য লাম্বদা ব্যবহার করা উপযুক্ত নয়?
উত্তর:
বেশ কয়েকটি মানদণ্ড রয়েছে যা আপনাকে ল্যাম্বডা ব্যবহার না করার বিষয়টি বিবেচনা করা উচিত:
priceIsOver100
। x -> x.price > 100
নাম হিসাবে ঠিক পরিষ্কার। আমি এর মতো নামগুলি isEligibleVoter
শর্তাবলীর একটি দীর্ঘ তালিকা প্রতিস্থাপন করে।ওভারবোর্ডে যাবেন না। মনে রাখবেন, সফ্টওয়্যারটি সহজেই পরিবর্তিত হয়। সন্দেহ হলে, এটি উভয় উপায়ে লিখুন এবং দেখুন যা পড়া সহজ।
এটা নির্ভর করে. আপনি যখনই নিজেকে একই জায়গায় একই ল্যাম্বডা ব্যবহার করে বিভিন্ন জায়গায় দেখতে পান আপনার ইন্টারফেসটি কার্যকর করে এমন একটি শ্রেণি প্রয়োগের বিষয়টি বিবেচনা করা উচিত। তবে আপনি যদি একটি বেনামি অভ্যন্তর শ্রেণি ব্যবহার করেন তবে অন্যথায় আমি মনে করি একটি ল্যাম্বডা আরও ভাল।
আমি কার্ল বিলেফেল্টের উত্তর সমর্থন করি, তবে একটি সংক্ষিপ্ত সংযোজন প্রদান করতে চাই।
কার্ল বিলেফেল্টের গৃহীত উত্তরটি সঠিক। আমি আরও একটি পার্থক্য যুক্ত করতে পারি:
শ্রেণীর অভ্যন্তরে কোনও পদ্ধতির অভ্যন্তরে থাকা ল্যাম্বডা কোডটি সেই পদ্ধতি ও শ্রেণীর মধ্যে পাওয়া কোনও কার্যকরভাবে চূড়ান্ত ভেরিয়েবল অ্যাক্সেস করতে পারে ।
ফাংশনাল ইন্টারফেস প্রয়োগ করে এমন একটি ক্লাস তৈরি করা আপনাকে কলিং কোডের স্থিতিতে যেমন সরাসরি অ্যাক্সেস দেয় না।
করার জাভা টিউটোরিয়াল উদ্ধৃত (জোর খনি):
স্থানীয় এবং বেনাম শ্রেণীর মতো ল্যাম্বডা এক্সপ্রেশনগুলি ভেরিয়েবল ক্যাপচার করতে পারে; ঘেরের সুযোগের স্থানীয় ভেরিয়েবলগুলিতে তাদের একই অ্যাক্সেস রয়েছে । তবে, স্থানীয় এবং বেনাম শ্রেণীর বিপরীতে ল্যাম্বডা এক্সপ্রেশনগুলির কোনও ছায়াময় সমস্যা নেই (আরও তথ্যের জন্য ছায়া দেখুন)। ল্যাম্বডা এক্সপ্রেশনগুলি নমনীয়ভাবে বাদ দেওয়া হয়েছে। এর অর্থ হ'ল তারা সুপারটাইপ থেকে কোনও নাম উত্তরাধিকারসূত্রে আসে না বা স্কোপিংয়ের একটি নতুন স্তরের পরিচয় দেয় না। ল্যাম্বডা এক্সপ্রেশনে ঘোষণাগুলি যেমন ঘের পরিবেশে থাকে তেমন ব্যাখ্যা করা হয়।
সুতরাং লম্বা কোডটি বের করার এবং এর নামকরণের সুবিধাগুলি থাকা সত্ত্বেও, আপনাকে অবশ্যই এটিকে বদ্ধকরণ পদ্ধতি এবং শ্রেণীর স্থানে সরাসরি অ্যাক্সেসের সরলতার বিপরীতে বিবেচনা করতে হবে।
দেখা:
এটি নিট-পিকিং হতে পারে, তবে অন্যান্য উত্তরে তৈরি করা সমস্ত চমৎকার পয়েন্টগুলিতে আমি যুক্ত করব:
সম্ভব হলে পদ্ধতি রেফারেন্সগুলি পছন্দ করুন । তুলনা করা:
employees.stream()
.map(Employee::getName)
.forEach(System.out::println);
বনাম
employees.stream()
.map(employee -> employee.getName())
.forEach(employeeName -> System.out.println(employeeName));
একটি পদ্ধতি রেফারেন্স ব্যবহার করে আপনি ল্যামডা এর যুক্তি (গুলি), যা সাধারণত অপ্রয়োজনীয় এবং / অথবা মত অলস নাম বাড়ে নাম প্রয়োজন সংরক্ষণ e
বা x
।
ম্যাট ম্যাকহেনির উত্তরের ভিত্তিতে ল্যাম্বডা এবং পদ্ধতি রেফারেন্সের মধ্যে একটি সম্পর্ক থাকতে পারে যেখানে ল্যাম্বডাকে পদ্ধতি উল্লেখের সিরিজ হিসাবে পুনরায় লেখা যেতে পারে। উদাহরণ স্বরূপ:
employees.stream()
.forEach(employeeName -> System.out.println(employee.getName()));
বনাম
employees.stream()
.map(Employee::getName)
.forEach(System.out::println);