জাভা -8 স্পেসে পড়া, আমি 'এসএএম টাইপস' এর উল্লেখগুলি দেখতে থাকি keep এটি কী, এর স্পষ্ট ব্যাখ্যা আমি পাইনি।
এসএএম টাইপ কী এবং কখন ব্যবহার করা যেতে পারে তার উদাহরণ দৃশ্যে কী?
জাভা -8 স্পেসে পড়া, আমি 'এসএএম টাইপস' এর উল্লেখগুলি দেখতে থাকি keep এটি কী, এর স্পষ্ট ব্যাখ্যা আমি পাইনি।
এসএএম টাইপ কী এবং কখন ব্যবহার করা যেতে পারে তার উদাহরণ দৃশ্যে কী?
উত্তর:
সারসংক্ষেপে লিংক জন পোস্ট 1 ক্ষেত্রে এটি কি কখনো যায় নিচে, "স্যাম" "একক বিমূর্ত পদ্ধতি" ঘোরা, এবং "স্যাম-টাইপ" মত ইন্টারফেস বোঝায় Runnable
, Callable
ইত্যাদি ল্যামডা এক্সপ্রেশন, জাভা 8 একটি নতুন বৈশিষ্ট্য রয়েছে একটি এসএএম প্রকার হিসাবে বিবেচিত এবং এগুলিতে অবাধে তাদের রূপান্তর করা যায়।
উদাহরণস্বরূপ, এর মতো ইন্টারফেস সহ:
public interface Callable<T> {
public T call();
}
আপনি Callable
এটির মতো একটি ল্যাম্বডা এক্সপ্রেশন ঘোষণা করতে পারেন :
Callable<String> strCallable = () -> "Hello world!";
System.out.println(strCallable.call()); // prints "Hello world!"
এই প্রসঙ্গে ল্যাম্বডা এক্সপ্রেশনগুলি বেশিরভাগই কেবল সিনট্যাকটিক চিনি। এগুলি নামবিহীন ক্লাসগুলির চেয়ে কোডে ভাল দেখায় এবং পদ্ধতি নামকরণে কম সীমাবদ্ধ। লিঙ্কটি থেকে এই উদাহরণটি নিন:
class Person {
private final String name;
private final int age;
public static int compareByAge(Person a, Person b) { ... }
public static int compareByName(Person a, Person b) { ... }
}
Person[] people = ...
Arrays.sort(people, Person::compareByAge);
এটি এমন একটি Comparator
নির্দিষ্ট পদ্ধতি ব্যবহার করে তৈরি করে যা একই নামটি ভাগ করে না Comparator.compare
, সেই পদ্ধতিতে আপনাকে ইন্টারফেসের নামকরণের অনুসরণ করতে হবে না এবং আপনার কোনও শ্রেণিতে একাধিক তুলনা ওভাররাইড থাকতে পারে, তারপরে ফ্লাইয়ের সাথে তুলনাগুলি তৈরি করুন ল্যাম্বদা এক্সপ্রেশন।
আরও গভীর হচ্ছে ...
একটি গভীর স্তরে, জাভা কার্যকরী এই ব্যবহার invokedynamic
বাইটকোড নির্দেশ জাভা 7. আমি যোগ আগেই বলেছি যে একটি ল্যামডা প্রকাশক একটি দৃষ্টান্ত সৃষ্টি Callable
বা Comparable
একটি বেনামী বর্গ অনুরূপ, কিন্তু যে না কঠোরভাবে সত্য। পরিবর্তে, প্রথমবার invokedynamic
বলা হয়ে থাকে, এটি LambdaMetafactory.metafactory
পদ্ধতিটি ব্যবহার করে একটি লাম্বদা ফাংশন হ্যান্ডলার তৈরি করে , তারপরে ভবিষ্যতে ল্যাম্বডায় অনুরোধে এই ক্যাশেড উদাহরণটি ব্যবহার করে। আরও উত্তর এই উত্তর পাওয়া যাবে ।
এই পদ্ধতিটি জটিল এবং এমনকী কোড রয়েছে যা আপনার ল্যাম্বদা কোডে প্রবেশের জন্য স্ট্যাক মেমরি থেকে সরাসরি আদিম মানগুলি এবং রেফারেন্সগুলি পড়তে পারে (উদাহরণস্বরূপ আপনার ল্যাম্বডাকে অনুরোধ করার জন্য একটি Object[]
অ্যারের বরাদ্দ করার দরকার পড়ার জন্য ), তবে এটি ভবিষ্যতে ল্যাম্বডা বাস্তবায়নের পুনরাবৃত্তির অনুমতি দেয় বাইটকোড সামঞ্জস্যতা নিয়ে চিন্তা না করে পুরানো বাস্তবায়নগুলি প্রতিস্থাপন করতে। ওরাকলের ইঞ্জিনিয়াররা যদি জেভিএম এর নতুন সংস্করণে অন্তর্নিহিত লাম্বদা বাস্তবায়ন পরিবর্তন করে, তবে পুরানো জেভিএম-তে সংকলিত লাম্বডাস স্বয়ংক্রিয়ভাবে বিকাশকের অংশে কোনও পরিবর্তন ছাড়াই নতুন বাস্তবায়নটি ব্যবহার করবেন।
1 লিঙ্কটির বাক্য গঠনটি পুরানো। কটাক্ষপাত ল্যামডা প্রকাশ জাভা পথচিহ্ন বর্তমান সিনট্যাক্স দেখতে।