জাভাতে 'এসএএম টাইপ' কী?


133

জাভা -8 স্পেসে পড়া, আমি 'এসএএম টাইপস' এর উল্লেখগুলি দেখতে থাকি keep এটি কী, এর স্পষ্ট ব্যাখ্যা আমি পাইনি।

এসএএম টাইপ কী এবং কখন ব্যবহার করা যেতে পারে তার উদাহরণ দৃশ্যে কী?


4
দেখুন cr.openjdk.java.net/~briangoetz/lambda/lambda-state-3.html (আমি একটি একক অনুসন্ধান, যা আমাকে অন্য তাই প্রশ্ন নিয়ে গেল পর দেখা যা)।
জন স্কিটি

2
পুরানো তথ্যের জন্য দয়া করে লোকেদের উল্লেখ করবেন না। কিছুটা দীর্ঘতর অনুসন্ধানে আপনাকে আরও আধুনিক সংস্করণে নিয়ে যেতে পারত : cr.openjdk.java.net/~briangoetz/lambda/lambda-state-4.html , যা নিজেই 18 বছরের পুরানো এবং এখন অনেকেরই পুরানো ated জায়গা. ওপির প্রশ্নের উত্তর ল্যাম্বডেফাক.আর.এ / কী- এটি- এ- ফাংশনাল- ইনটারফেসে দেওয়া হয়েছে , একটি FAQ- র একটি পৃষ্ঠা যা আমি সম্প্রতি পরিবর্তনশীল ভাষা এবং এপিআই বিকাশ পর্যন্ত কী ছিল তা স্থির রাখার চেষ্টা করি।
মরিস নাফটালিন

1
@ মরিসনিফটালিন আপনি কেবল জাভা ট্রেইলকেই লিঙ্ক করতে পারেন , এটি ডেভলপমেন্ট টিম আপ টু ডেট রাখে।
ব্রায়ান

1
বর্তমান শব্দটি হ'ল "ফাংশনাল ইন্টারফেস"।
newacct

1
@ মরিসনাফটালিন: দুঃখিত, এটি মিস করেছেন। আমি যদি এটি খুঁজে পেতাম তবে অবশ্যই এটির সাথে লিঙ্ক করতাম।
জন স্কিটি

উত্তর:


142

সারসংক্ষেপে লিংক জন পোস্ট 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 লিঙ্কটির বাক্য গঠনটি পুরানো। কটাক্ষপাত ল্যামডা প্রকাশ জাভা পথচিহ্ন বর্তমান সিনট্যাক্স দেখতে।

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