জাভা 8-এ ব্যবহৃত ক্রিয়ামূলক ইন্টারফেসগুলি কী কী?


154

আমি জাভা 8 এ একটি নতুন শব্দটি পেলাম: "ফাংশনাল ইন্টারফেস"। ল্যাম্বডা এক্সপ্রেশন নিয়ে কাজ করার সময় আমি কেবল এটির একটি ব্যবহার খুঁজে পেতে পারি ।

জাভা 8 কিছু বিল্ট-ইন ফাংশনাল ইন্টারফেস সরবরাহ করে এবং যদি আমরা কোনও কার্যকরী ইন্টারফেস সংজ্ঞায়িত করতে চাই তবে আমরা @FunctionalInterfaceটীকাগুলির ব্যবহার করতে পারি । এটি আমাদের ইন্টারফেসে কেবল একটি একক পদ্ধতি ঘোষণা করার অনুমতি দেবে।

উদাহরণ স্বরূপ:

@FunctionalInterface
interface MathOperation {
    int operation(int a, int b);
}

জাভা 8 এ কেবলমাত্র ল্যাম্বডা এক্সপ্রেশন দিয়ে কাজ করা ছাড়া এটি কতটা কার্যকর ?

(প্রশ্ন এখানে এক আমি জিজ্ঞাসা করলাম থেকে ভিন্ন এটা জিজ্ঞাসা করা হয় কেন আমরা কার্মিক ইন্টারফেসগুলি প্রয়োজন ল্যামডা এক্সপ্রেশন সঙ্গে কাজ করার সময় আমার প্রশ্ন হচ্ছে:।। কেন অন্য ব্যবহারের কার্মিক ইন্টারফেসগুলি ল্যামডা এক্সপ্রেশন সঙ্গে ব্যতীত হবে?)


1
এটি এই লিঙ্কে দ্বিধা দেখায়। ফাংশনাল ইন্টারফেসে কেন কেবল একটি পদ্ধতি থাকা উচিত সে সম্পর্কেও তারা আলোচনা করে। stackoverflow.com/questions/33010594/…
কুলভূষণ সিং

1
@ কুলভূষণসিংহ আমি পোস্ট করার আগে এই প্রশ্নটি দেখেছি ... উভয় প্রশ্নেরই পার্থক্য বোধ করা হচ্ছে ...
মধুসূদন

উত্তর:


127

@FunctionalInterfaceআপনার কোডটি সংকলনের সময় পরীক্ষার জন্য টীকাটি কার্যকর। আপনার একাধিক পদ্ধতি ছাড়াও static, defaultএবং Objectআপনার @FunctionalInterfaceবা অন্য কোনও ইন্টারফেসে কার্যকরী ইন্টারফেস হিসাবে ব্যবহৃত পদ্ধতিগুলিকে ওভাররাইড করে এমন বিমূর্ত পদ্ধতি থাকতে পারে না ।

তবে আপনি এই টিকা ছাড়াই ল্যাম্বডাস ব্যবহার করতে পারবেন পাশাপাশি @Overrideটিকা ছাড়াই পদ্ধতিগুলিকে ওভাররাইড করতে পারেন ।

ডক্স থেকে

একটি কার্যকরী ইন্টারফেসের ঠিক একটি বিমূর্ত পদ্ধতি রয়েছে। যেহেতু ডিফল্ট পদ্ধতিগুলির একটি বাস্তবায়ন থাকে, সেগুলি বিমূর্ত নয়। যদি কোনও ইন্টারফেস জাভা.লং এর সর্বজনীন পদ্ধতির একটিকে ছাড়িয়ে যাওয়ার মতো একটি বিমূর্ত পদ্ধতি ঘোষণা করে bঅজেক্ট, এটি ইন্টারফেসের বিমূর্ত পদ্ধতি গণনার দিকেও গণনা করে না কারণ ইন্টারফেসের কোনও প্রয়োগকরণ জাভা.এল.অ্যাজেক্ট বা অন্য কোথাও থেকে একটি বাস্তবায়ন করতে পারে since

এটি ল্যাম্বডা এক্সপ্রেশন ব্যবহার করা যেতে পারে :

public interface Foo {
  public void doSomething();
}

এটি ল্যাম্বডা এক্সপ্রেশন ব্যবহার করা যাবে না :

public interface Foo {
  public void doSomething();
  public void doSomethingElse();
}

তবে এটি সংকলন ত্রুটি দেবে :

@FunctionalInterface
public interface Foo {
  public void doSomething();
  public void doSomethingElse();
}

অবৈধ '@FunctionalInterface' টিকা; ফু কোনও কার্যকরী ইন্টারফেস নয়


43
আরও সুনির্দিষ্টভাবে বলতে গেলে, আপনার ঠিক একটি বিমূর্ত পদ্ধতি থাকতে হবে যা java.lang.Objectকার্যকরী ইন্টারফেসে কোনও পদ্ধতিকে ওভাররাইড করে না ।
হলগার

9
... এবং এটি "একটির বেশি না সামান্য আলাদা publicপদ্ধতি ব্যতীত staticএবং default" ...
হোলগার

4
তবুও এটি থাকার কোনও বিন্দু বুঝতে পারছি না। পৃথিবীর যে কেউ তার ইন্টারফেসের কতগুলি পদ্ধতি আছে তা পরীক্ষা করে কেন বিরক্ত হবে। চিহ্নিতকারী ইন্টারফেসগুলির এখনও একটি পয়েন্ট এবং একটি নির্দিষ্ট উদ্দেশ্য রয়েছে। ডকুমেন্টেশন এবং উত্তর কেবল এটি কী করে তা ব্যাখ্যা করে, এটি কোনওভাবেই কীভাবে ব্যবহৃত হয় তা নয়। এবং "ব্যবহার" হ'ল ওপি। সুতরাং আমি এই উত্তরটি সুপারিশ করব না।
saran3h

1
@ ভিএনটি সংকলন ত্রুটিটি এই ইন্টারফেসের ক্লায়েন্টদের পেতে, তবে ইন্টারফেসটি নিজেই পরিবর্তন করতে পারে না। এই টীকাটি সহ সংকলন ত্রুটিটি ইন্টারফেসে রয়েছে, সুতরাং আপনি নিশ্চিত হন যে আপনার ইন্টারফেসের ক্লায়েন্টদের কেউ ভাঙবে না।
সের্গেই বিশায়ার

2
এটি তাদের কীভাবে ব্যবহার করবেন তা দেখায় কিন্তু আমাদের কেন তাদের প্রয়োজন তা ব্যাখ্যা করে না।
শেখ

14

ডকুমেন্টেশন প্রকৃতপক্ষে উদ্দেশ্য মধ্যে একটি পার্থক্য তোলে

একটি ইন্টারফেস প্রকারের ঘোষণাকে জাভা ল্যাঙ্গুয়েজ স্পেসিফিকেশন দ্বারা সংজ্ঞায়িত হিসাবে ফাংশনাল ইন্টারফেস হিসাবে চিহ্নিত করা যেতে ইঙ্গিত করতে ব্যবহৃত হয় এমন একটি তথ্যবহুল টীকা প্রকরণ type

এবং ব্যবহারের ক্ষেত্রে

নোট করুন যে ফাংশনাল ইন্টারফেসগুলির উদাহরণগুলি ল্যাম্বডা এক্সপ্রেশন, পদ্ধতি রেফারেন্স বা কনস্ট্রাক্টর রেফারেন্স সহ তৈরি করা যেতে পারে।

যার শব্দগুচ্ছ সাধারণভাবে অন্যান্য ব্যবহারের ক্ষেত্রে বাধা দেয় না। যেহেতু প্রাথমিক উদ্দেশ্যটি ক্রিয়ামূলক ইন্টারফেসটি নির্দেশ করে তাই আপনার আসল প্রশ্নটি " ল্যাম্বদা এক্সপ্রেশন এবং পদ্ধতি / কনস্ট্রাক্টর রেফারেন্স ব্যতীত ফাংশনাল ইন্টারফেসের জন্য অন্যান্য ব্যবহারের ক্ষেত্রে আছে কি?"

যেহেতু ফাংশনাল ইন্টারফেসটি জাভা ল্যাঙ্গুয়েজ স্পেসিফিকেশন দ্বারা সংজ্ঞায়িত একটি জাভা ভাষার নির্মাণ, তাই কেবলমাত্র সেই স্পেসিফিকেশনই এই প্রশ্নের উত্তর দিতে পারে:

জেএলএস §9.8। কার্যকরী ইন্টারফেস :

...

কোনও শ্রেণি ঘোষণা করে এবং ইনস্ট্যান্ট করে একটি ইন্টারফেস উদাহরণ তৈরি করার স্বাভাবিক প্রক্রিয়া ছাড়াও, পদ্ধতি রেফারেন্স এক্সপ্রেশন এবং ল্যাম্বডা এক্সপ্রেশন (§15.13, .215.27) দিয়ে ক্রিয়ামূলক ইন্টারফেসগুলির উদাহরণ তৈরি করা যেতে পারে।

সুতরাং জাভা ল্যাঙ্গুয়েজ স্পেসিফিকেশন অন্যথায় বলে না, section বিভাগে বর্ণিত একমাত্র ব্যবহারের ক্ষেত্রে হ'ল পদ্ধতি রেফারেন্স এক্সপ্রেশন এবং ল্যাম্বডা এক্সপ্রেশন সহ ইন্টারফেস উদাহরণ তৈরি করা। (এটিতে নির্মাতার রেফারেন্স অন্তর্ভুক্ত রয়েছে কারণ তারা স্পেসিফিকেশনে পদ্ধতি রেফারেন্সের মত প্রকাশের এক রূপ হিসাবে চিহ্নিত হয়)।

সুতরাং এক বাক্যে, না, জাভা 8 এ এর ​​জন্য অন্য কোনও ব্যবহারের মামলা নেই।


শুধু একটু জন্য খুব বেশী জিজ্ঞাসা করা হতে পারে বা অপ্রাসঙ্গিক (আপনি উত্তর না করে পারে), কিন্তু আপনি কি সুপারিশ করবে যখন কেউ একটি ইউটিলিটি নির্মিত public static String generateTaskId()বনাম এটা আরো "কার্মিক" অন্য কারো যেমন লিখতে বেছে নেওয়া হয়েছে করতে public class TaskIdSupplier implements Supplier<String>সঙ্গে getপদ্ধতি ব্যবহার করে বিদ্যমান প্রজন্মের বাস্তবায়ন। এটি কি কার্যকরী ইন্টারফেসগুলির অপব্যবহার, বিশেষত জেডিকে Supplierঅন্তর্নির্মিত থেকে পুনরায় ব্যবহার করা? পিএস: আমি এটি চাইতে আরও ভাল জায়গা / প্রশ্নোত্তর খুঁজে পাইনি। আপনি পরামর্শ দিতে পারলে হিজরত করে খুশি।
নামান

1
@ নামান আপনি যখন কোনও নামী বর্গ তৈরি করবেন তখন আপনি ইউটিলিটি পদ্ধতিটি আরও কার্যকরী করছেন না TaskIdSupplier। এখন, প্রশ্ন হল আপনি কেন নামযুক্ত বর্গ তৈরি করলেন? এমন পরিস্থিতিতে রয়েছে যেখানে এই জাতীয় নামকরণের প্রয়োজন হয়, যেমন আপনি যখন প্রয়োগের মাধ্যমে এটি খুঁজে পেতে সহায়তা করতে চান ServiceLoaderSupplierতখন তা বাস্তবায়ন করতে দোষ নেই । তবে যখন আপনার এটির প্রয়োজন হবে না, এটি তৈরি করবেন না। যখন আপনার কেবলমাত্র একটি প্রয়োজন হয় Supplier<String>, এটি ইতিমধ্যে ব্যবহারের পক্ষে পর্যাপ্ত DeclaringClass::generateTaskIdএবং স্পষ্ট শ্রেণীর প্রয়োজনীয়তা অপসারণ এই ভাষা বৈশিষ্ট্যের মূল বিষয়।
হলগার

সত্যি কথা বলতে, আমি যে প্রস্তাবটি দিয়ে যাচ্ছিলাম তার ন্যায্যতার দিকে চেয়ে ছিল। কর্মক্ষেত্রে কোনও কারণে আমি সত্যিই অনুভব করিনি যে TaskIdSupplierবাস্তবায়নটি চেষ্টাটির পক্ষে মূল্যবান, তবে তারপরে ServiceLoaderআমার ধারণাটি পুরোপুরি বাদ দেওয়া হয়েছিল। এই আলোচনা চলাকালীন আমাদের কয়েকটি প্রশ্নের মুখোমুখি হয়েছিল যেমন কেউ যখন এগিয়ে যায় এবং তাদের নিজস্ব ইন্টারফেস বিকাশ করতে পারে তখন তার অস্তিত্বের ব্যবহার কী ? Supplierpublicএবং কেন public static Supplier<String> TASK_ID_SUPPLIER = () ->...বিশ্বব্যাপী ধ্রুবক হিসাবে নেই? । (1/2)
নামান

1
জাভাতে ফাংশনগুলি উপস্থাপন করার জন্য নেমান @ মূর্খ পদ্ধতিটি হ'ল পদ্ধতি এবং সেই ফাংশনগুলির মূল্যায়ন সেগুলি অনুরোধ করার মতো is কখনও একজন বিকাশকারী করতে বাধ্য করা হবে variable.genericMethodName(args)পরিবর্তে meaningfulMethodName(args)। ল্যাংডা এক্সপ্রেশন / পদ্ধতি রেফারেন্সের মাধ্যমে বা ম্যানুয়ালি তৈরি ক্লাসের মাধ্যমে কোনও ক্রিয়াকলাপ উপস্থাপনের জন্য শ্রেণীর প্রকারের ব্যবহারটি কেবল জাভাতে সত্যিকারের ফাংশনের ধরণের অনুপস্থিতিতে ফাংশনটি পাস করার জন্য কেবল একটি বাহন । এটি কেবল যখন প্রয়োজন হয় তখনই করা উচিত।
হোলার

1
যখন আপনার কাছে একটি ছোট কোডের খণ্ডন কেবল চারপাশে পাস করা হচ্ছে, আপনি এটি ল্যাম্পডা এক্সপ্রেশনটি আবদ্ধ করতে পারেন। যখনই এটিকে কোনও পদ্ধতির মতো প্রার্থনা করার প্রয়োজন হয় (এতে কোডের খণ্ডটি তুচ্ছ নয়, তখন এটি পরীক্ষার প্রয়োজনে দৃশ্যের অন্তর্ভুক্ত থাকে), একটি নামযুক্ত পদ্ধতি তৈরি করুন যা আহবান করা যেতে পারে এবং কোনও পদ্ধতি রেফারেন্স বা ল্যাম্বডা এক্সপ্রেশন / স্পষ্ট শ্রেণি ব্যবহার করতে পারে একটি কল encapsulating, প্রয়োজন যখন এটি কাছাকাছি পাস। কনস্ট্যান্টগুলি কেবল তখনই কার্যকর যখন আপনি ল্যাবডা এক্সপ্রেশন বা আপনার কোডে এম্বেড করা পদ্ধতি রেফারেন্সের দক্ষতার উপর বিশ্বাস করবেন না, অন্য কথায়, এগুলির প্রায় প্রয়োজন হয় না।
হোলার

12

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


10

একেবারেই না. ল্যাম্বদা এক্সপ্রেশনগুলি সেই টীকাটির এক এবং পয়েন্ট।


6
ওয়েল, লামদ্বাস টীকা ছাড়াই কাজ করে। এটি একটি অনুরোধ ঠিক যেমন @Overrideসংকলককে জানাতে চাই যে আপনি "ফাংশনাল" এমন কিছু লেখার ইচ্ছা করেছিলেন (এবং আপনি পিছলে গেলে একটি ত্রুটি পান)।
থিলো

1
কিছুটা সংক্ষিপ্ত হলেও সোজা পয়েন্ট এবং সঠিক উত্তর। আমি আরও কথার সাথে একই জিনিসটি বলে আরও বিস্তৃত উত্তর যুক্ত করার জন্য সময় নিলাম ...
হলগার

5

একটি ল্যাম্বডা এক্সপ্রেশনটি একটি কার্যকরী ইন্টারফেস প্রকারের জন্য বরাদ্দ করা যেতে পারে তবে পদ্ধতি পদ্ধতি এবং বেনাম শ্রেণিগুলিও তাই করতে পারে।

নির্দিষ্ট কার্মিক ইন্টারফেসগুলি প্রায় এক চমৎকার জিনিস java.util.functionযে তারা নতুন ফাংশন (যেমন তৈরি করতে গঠিত হতে পারে Function.andThenএবং Function.compose, Predicate.andইত্যাদি) কুশলী ডিফল্ট পদ্ধতি সেগুলির মধ্যে উপস্থিত কারণে।


আপনার এই মন্তব্যে আরও বিস্তারিত বলা উচিত। পদ্ধতি রেফারেন্স এবং নতুন ফাংশন সম্পর্কে কী?
নিকোলাস

5

একটি মাত্র বিমূর্ত পদ্ধতিযুক্ত একটি ইন্টারফেসকে ফাংশনাল ইন্টারফেস বলে। @ ফাংশনাল ইনটারফেস ব্যবহার করা বাধ্যতামূলক নয়, তবে দুর্ঘটনাক্রমে অতিরিক্ত পদ্ধতি সংযোজন এড়াতে এটি কার্যকরী ইন্টারফেসের সাথে ব্যবহার করা ভাল অনুশীলন। যদি ইন্টারফেসটি @FunctionalInterface টীকা সহ টীকাযুক্ত হয় এবং আমরা একাধিক বিমূর্ত পদ্ধতি থাকার চেষ্টা করি তবে এটি সংকলক ত্রুটি ছুঁড়ে দেয়।

package com.akhi;
    @FunctionalInterface
    public interface FucnctionalDemo {

      void letsDoSomething();
      //void letsGo();      //invalid because another abstract method does not allow
      public String toString();    // valid because toString from Object 
      public boolean equals(Object o); //valid

      public static int sum(int a,int b)   // valid because method static
        {   
            return a+b;
        }
        public default int sub(int a,int b)   //valid because method default
        {
            return a-b;
        }
    }

3

কার্যকরী ইন্টারফেস:

  • জাভা 8 তে পরিচয় করিয়ে দেওয়া
  • ইন্টারফেস যা একটি "একক বিমূর্ত" পদ্ধতি ধারণ করে।

উদাহরণ 1:

   interface CalcArea {   // --functional interface
        double calcArea(double rad);
    }           

উদাহরণ 2:

interface CalcGeometry { // --functional interface
    double calcArea(double rad);
    default double calcPeri(double rad) {
        return 0.0;
    }
}       

উদাহরণ 3:

interface CalcGeometry {  // -- not functional interface
    double calcArea(double rad);
    double calcPeri(double rad);
}   

জাভা 8 টিকা - @FunctionalInterface

  • টীকাগুলি পরীক্ষা করে দেখুন যে ইন্টারফেসটিতে কেবল একটি বিমূর্ত পদ্ধতি রয়েছে। যদি না হয়, ত্রুটি উত্থাপন।
  • @FunctionalInterface অনুপস্থিত থাকলেও এটি এখনও কার্যকরী ইন্টারফেস (যদি একক বিমূর্ত পদ্ধতি থাকে)। টীকাগুলি ভুল এড়াতে সহায়তা করে।
  • কার্যকরী ইন্টারফেসে অতিরিক্ত স্থিতিশীল ও ডিফল্ট পদ্ধতি থাকতে পারে।
  • উদাহরণস্বরূপ তুলনামূলক <>, তুলনীয় <>, তুলনামূলক <>।

কার্যকরী ইন্টারফেসের অ্যাপ্লিকেশন:

  • পদ্ধতি রেফারেন্স
  • লাম্বদা এক্সপ্রেশন
  • কনস্ট্রাক্টর রেফারেন্স

ক্রিয়ামূলক ইন্টারফেস শিখতে, ইন্টারফেসে প্রথম ডিফল্ট পদ্ধতিগুলি শিখুন, এবং কার্যকরী ইন্টারফেস শেখার পরে, আপনার কাছে পদ্ধতি রেফারেন্স এবং ল্যাম্বডা এক্সপ্রেশন বোঝা সহজ হবে


আপনার প্রথম দুটি উদাহরণের এটিতে 'বিমূর্ত' কীওয়ার্ড থাকা উচিত?
sofs1

1
@ সফস 1 ইন্টারফেসে ঘোষিত পদ্ধতিগুলি ডিফল্টরূপে সর্বজনীন এবং বিমূর্ত হয়। বিমূর্ত শ্রেণিতে পদ্ধতিগুলির ক্ষেত্রে আপনাকে বিমূর্ত কীওয়ার্ডটি ব্যবহার করতে হবে। তবে ইন্টারফেসেও পদ্ধতিগুলির জন্য বিমূর্ত কীওয়ার্ডটি ব্যবহার করা ভাল। তারা এটি পুরানো জাভা সংস্করণের সামঞ্জস্যের জন্য অনুমোদিত করেছে তবে এটি নিরুৎসাহিত করা হয়েছে।
কেতন

2

আপনি জাভা 8 এ ল্যাম্বডা ব্যবহার করতে পারেন

public static void main(String[] args) {
    tentimes(inputPrm - > System.out.println(inputPrm));
    //tentimes(System.out::println);  // You can also replace lambda with static method reference
}

public static void tentimes(Consumer myFunction) {
    for (int i = 0; i < 10; i++)
        myFunction.accept("hello");
}

সম্পর্কে আরও তথ্যের জন্য জাভা Lambdas এবং FunctionalInterfaces


1

@FunctionalInterface জাভা 8 দিয়ে একটি নতুন টীকা প্রকাশিত হয় এবং ল্যাম্বডা এক্সপ্রেশনগুলির জন্য লক্ষ্য ধরণের সরবরাহ করে এবং এটি আপনার কোড সংকলনের সময় পরীক্ষায় ব্যবহৃত হয়।

আপনি যখন এটি ব্যবহার করতে চান:

1- আপনার ইন্টারফেসে একাধিক বিমূর্ত পদ্ধতি থাকা উচিত নয় , অন্যথায় সংকলন ত্রুটি দেওয়া হবে।

1- আপনার ইন্টারফেসটি খাঁটি হওয়া উচিত, যার অর্থ কার্যনির্বাহী ইন্টারফেসটি রাষ্ট্রবিহীন শ্রেণি দ্বারা প্রয়োগ করা হবে, শুদ্ধের এক্সপ্লেস Comparatorইন্টারফেস কারণ এটি প্রয়োগকারী রাষ্ট্রের উপর নির্ভর করে না, এক্ষেত্রে কোনও সংকলন ত্রুটি দেওয়া হবে না, তবে অনেক ক্ষেত্রে আপনি এই জাতীয় ইন্টারফেসের সাথে ল্যাম্বডা ব্যবহার করতে সক্ষম হবে না

java.util.functionপ্যাকেজ বিভিন্ন সাধারণ কাজের কার্মিক ইন্টারফেসগুলি যেমন রয়েছে Predicate, Consumer, Function, এবং Supplier

এছাড়াও দয়া করে নোট করুন যে আপনি এই টিকাটি ছাড়াই ল্যাম্বডাস ব্যবহার করতে পারেন।


1

অন্যান্য উত্তরের পাশাপাশি, আমি মনে করি "কেন সরাসরি ল্যাম্বডা এক্সপ্রেশন ছাড়া ফাংশনাল ইন্টারফেস ব্যবহার করা" এর মূল কারণ জাভা ভাষার প্রকৃতির সাথে সম্পর্কিত হতে পারে যা অবজেক্ট ওরিয়েন্টেড।

লাম্বদা এক্সপ্রেশনগুলির প্রধান বৈশিষ্ট্যগুলি হ'ল: ১. এগুলিকে প্রায় ২.০০ পাশ করা যায় এবং নির্দিষ্ট সময়ে (বেশ কয়েকবার) তারা ভবিষ্যতে কার্যকর করতে পারে। এখন ভাষাগুলিতে এই বৈশিষ্ট্যটিকে সমর্থন করার জন্য, আরও কিছু ভাষা কেবল এই বিষয়টি নিয়ে কাজ করে।

জাভা স্ক্রিপ্টে উদাহরণস্বরূপ, কোনও ফাংশন (বেনামে ফাংশন, বা ফাংশন আক্ষরিক) একটি বিষয় হিসাবে সম্বোধন করা যেতে পারে। সুতরাং, আপনি এগুলি সহজভাবে তৈরি করতে পারেন এবং এগুলি একটি ভেরিয়েবল এবং আরও কিছু ক্ষেত্রে নির্ধারিত হতে পারে। উদাহরণ স্বরূপ:

var myFunction = function (...) {
    ...;
}
alert(myFunction(...));

বা ES6 এর মাধ্যমে আপনি একটি তীর ফাংশন ব্যবহার করতে পারেন।

const myFunction = ... => ...

এখনও অবধি, জাভা ভাষার ডিজাইনারগণ এই পদ্ধতিগুলি (কার্যকরী প্রোগ্রামিং কৌশল) এর মাধ্যমে উল্লিখিত বৈশিষ্ট্যগুলি পরিচালনা করতে স্বীকার করেন নি। তারা বিশ্বাস করে যে জাভা ভাষা অবজেক্ট ওরিয়েন্টেড এবং তাই তাদের উচিত এই সমস্যাটি অবজেক্ট ওরিয়েন্টেড কৌশলগুলির মাধ্যমে সমাধান করা উচিত। তারা জাভা ভাষার সরলতা এবং ধারাবাহিকতা মিস করতে চান না।

অতএব, তারা ইন্টারফেসগুলি ব্যবহার করে, যেমন যখন কেবলমাত্র একটি পদ্ধতির (মানে ফাংশনাল ইন্টারফেস) ইন্টারফেসের কোনও বস্তুর প্রয়োজন হয় আপনি এটি ল্যাম্বডা এক্সপ্রেশন দিয়ে প্রতিস্থাপন করতে পারেন। যেমন:

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