জাভা 8-এ প্যারামিটার হিসাবে ল্যাম্বডা লাগে এমন একটি পদ্ধতি আমি কীভাবে সংজ্ঞায়িত করব?


363

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

MyClass.method((a, b) -> a+b);


class MyClass{
  //How do I define this method?
  static int method(Lambda l){
    return l(5, 10);
  }
}

29
ভাল প্রশ্ন. এবং আপনি ঠিক বলেছেন: টিউটোরিয়ালের কোনওটিতেই সেই অংশটি নেই।
মার্টিন

উত্তর:


247

ল্যাম্বডাস সম্পূর্ণরূপে একটি কল-সাইট কনস্ট্রাক্ট: ল্যাম্বড্ডার প্রাপক এটি জানার দরকার নেই যে কোনও ল্যাম্বদা জড়িত, পরিবর্তে এটি উপযুক্ত পদ্ধতির সাথে একটি ইন্টারফেস গ্রহণ করে।

অন্য কথায়, আপনি একটি কার্যকরী ইন্টারফেস (অর্থাত্ একটি একক পদ্ধতিতে একটি ইন্টারফেস) সংজ্ঞায়িত বা ব্যবহার করেন যা আপনি যা চান ঠিক তা গ্রহণ করে এবং ফেরত দেয়।

এই জাভা 8-তে সাধারণত-ব্যবহৃত ইন্টারফেস ধরণের একটি সেট আসে java.util.function( জাভাডোক সম্পর্কে ইঙ্গিত দেওয়ার জন্য মরিস নাফটালিনকে ধন্যবাদ )।

এই নির্দিষ্ট ব্যবহারের ক্ষেত্রে জন্য আছে java.util.function.IntBinaryOperatorসঙ্গে একটি একক int applyAsInt(int left, int right)পদ্ধতি , যাতে আপনি আপনার লিখতে পারে methodএরকম:

static int method(IntBinaryOperator op){
    return op.applyAsInt(5, 10);
}

তবে আপনি ঠিক নিজের ইন্টারফেসটি সংজ্ঞায়িত করতে এবং এটি ব্যবহার করতে পারেন:

public interface TwoArgIntOperator {
    public int op(int a, int b);
}

//elsewhere:
static int method(TwoArgIntOperator operator) {
    return operator.op(5, 10);
}

আপনার নিজের ইন্টারফেসটি ব্যবহার করার সুবিধা রয়েছে যে আপনার নাম থাকতে পারে যা আরও স্পষ্টভাবে উদ্দেশ্যটি নির্দেশ করে।


5
ব্যবহারের জন্য কি অন্তর্নির্মিত ইন্টারফেস থাকবে, বা আমি যে প্রতিটি লাম্বদা নিতে চাই তার জন্য আমার একটি ইন্টারফেস তৈরি করতে হবে?
মারিউস

পুনঃব্যবহারযোগ্যতা বনাম বর্ণনামূলক নাম দ্বিধা সম্পর্কে একটি ভাল সমঝোতা হ'ল এটি নির্দিষ্ট করে দেওয়া পদ্ধতিটিকে ওভাররাইড না করে বিল্ট ইন ইন্টারফেসকে বাড়ানো হবে। এটি আপনাকে কেবলমাত্র একক অতিরিক্ত লাইন কোডের বর্ণনামূলক নাম দেয়।
বাইর্ন

আমি পাই না। সে যে কোনও কিছুর জন্য ল্যাম্বদা পাস করতে পারে এবং এটি কাজ করবে? যদি সে পাসের কি হবে (int a, int b, int c)জন্য TwoArgIntOperator। দিলে কি হবে TwoArgIntOperatorহয়েছে দুই একই স্বাক্ষর সহ পদ্ধতি। এই উত্তরটি বিভ্রান্তিকর।
টোমা জ্যাটো - মনিকা

7
@ টোম্যাজাটো: আপনি যদি মিল না-করা যুক্তিযুক্ত ল্যাম্বদা ব্যবহার করেন তবে সংকলকটি অভিযোগ করবে। এবং দুটি (অ-ডিফল্ট) পদ্ধতিযুক্ত ইন্টারফেসগুলি ল্যাম্বডাস হিসাবে ব্যবহারযোগ্য হবে না, কারণ কেবল কার্যকরী ইন্টারফেসই ব্যবহার করা যেতে পারে।
জোছিম সৌর

একটি মৌলিক প্রশ্ন: আমি মনে করি যে এখনও প্যারামিটার হিসাবে কোনও পদ্ধতিটি পাস করার দিকটি অনুধাবন করার সাথে আমি অনুধাবন করতে পারি না method তিনি যদি পরামিতি হিসাবে টুআরজিইন্টঅপ্রেটার পাস করে থাকেন এবং তাকে সেই পদ্ধতির প্যারামিটারটি আলাদাভাবে পাস করার প্রয়োজন হয়, এটি কি কুশ্রী দেখাচ্ছে না? প্যারামিটারের সাথে সম্পূর্ণ এক্সিকিউশন বডিটি পাশ করার কোনও উপায় আছে কি? আপনার উদাহরণের মতো, "5" এবং "10" হার্ডকডিং এড়ানোর একটি উপায়।
instanceOfObject

63

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

ব্যবহারকারীর সংজ্ঞায়িত ফাংশনাল ইন্টারফেস ব্যবহার করা

interface TwoArgInterface {

    public int operation(int a, int b);
}

public class MyClass {

    public static void main(String javalatte[]) {
        // this is lambda expression
        TwoArgInterface plusOperation = (a, b) -> a + b;
        System.out.println("Sum of 10,34 : " + plusOperation.operation(10, 34));

    }
}

জাভা ফাংশনাল ইন্টারফেস ব্যবহার করে

import java.util.function.IntBinaryOperator;

public class MyClass1 {

    static void main(String javalatte[]) {
        // this is lambda expression
        IntBinaryOperator plusOperation = (a, b) -> a + b;
        System.out.println("Sum of 10,34 : " + plusOperation.applyAsInt(10, 34));

    }
}

আমি তৈরি অন্যান্য উদাহরণ এখানে


IntBinaryOperatorডকুমেন্টেশনের লিঙ্কটি মারা গেছে।
হেন্ডরিকোতো

1
আমি এখনও অবধি খুঁজে পাওয়া ল্যাম্বদার এটির সেরা উদাহরণ এবং অবশেষে এটিই কেবল আমাকে পেয়েছিল।
জিম্মি স্মিথজেআর

1
সুওওও ... মূলত একজন প্রতিনিধি, কিন্তু আমাদের এটাকে কল করার কথা নয়?
রায়ান লুন্ডি

37

২ টির বেশি পরামিতি নেই এমন ক্রিয়াকলাপগুলির জন্য, আপনি নিজের ইন্টারফেসটি সংজ্ঞায়িত না করে সেগুলি পাস করতে পারেন। উদাহরণ স্বরূপ,

class Klass {
  static List<String> foo(Integer a, String b) { ... }
}

class MyClass{

  static List<String> method(BiFunction<Integer, String, List<String>> fn){
    return fn.apply(5, "FooBar");
  }
}

List<String> lStr = MyClass.method((a, b) -> Klass.foo((Integer) a, (String) b));

ইন BiFunction<Integer, String, List<String>>, Integerএবং Stringএর পরামিতিগুলি হয় এবং List<String>এটির ফেরতের প্রকার।

শুধুমাত্র একটি প্যারামিটার সহ কোনও ক্রিয়াকলাপের জন্য, আপনি এটির প্যারামিটারের প্রকারটি Function<T, R>কোথায় ব্যবহার করতে পারেন Tএবং Rএটির ফেরত মান ধরণ। ইতিমধ্যে জাভা দ্বারা উপলব্ধ করা সমস্ত ইন্টারফেসের জন্য এই পৃষ্ঠাটি দেখুন


15

Http://lambdafaq.org/lambda-res উত্স থেকে লিঙ্কযুক্ত ল্যাম্বডা-সক্ষম জাভা 8 জাভডোকের একটি সর্বজনীন ওয়েব অ্যাক্সেসযোগ্য সংস্করণ রয়েছে । (এটি অবশ্যই জোছিম সৌরর উত্তরের মন্তব্য হওয়া উচিত, তবে যে মন্তব্য খ্যাতিমান পয়েন্ট রয়েছে সেগুলি নিয়ে আমি আমার এসও অ্যাকাউন্টে প্রবেশ করতে পারব না।) ল্যাম্বডাফাক সাইটটি (আমি এটি বজায় রেখেছি) এটির উত্তর দেয় এবং আরও অনেক জাভা হয় -লম্বদা প্রশ্ন।

এনবি এই উত্তরটি জাভা 8 জিএ ডকুমেন্টেশন সর্বজনীনভাবে উপলভ্য হওয়ার আগেই লেখা হয়েছিল । যদিও আমি জায়গায় রেখে এসেছি, কারণ জাবা 8-এ প্রবর্তিত বৈশিষ্ট্যগুলি সম্পর্কে শেখার জন্য ল্যাম্বদা এফএকিউ এখনও কার্যকর হতে পারে।


2
লিঙ্কটি এবং আপনি যে সাইটটি বজায় রেখেছেন তার জন্য ধন্যবাদ! আমার উত্তরে আপনার সার্বজনীন জাভাডকের লিঙ্কগুলি যুক্ত করার জন্য আমি স্বাধীনতা নিয়েছি।
জোছিম সউর

1
পার্শ্ব নোট হিসাবে: মনে হচ্ছে আপনি ল্যাম্বডাসের জন্য যা জেনারিক্সের জন্য অ্যাঞ্জেলিকা ল্যাঙ্গার তৈরি করেছিলেন তা তৈরি করছেন । তার জন্য ধন্যবাদ, জাভার এমন সংস্থান দরকার!
জোছিম সউর

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

@ ক্লেয়ারলজিক হ্যাঁ, একমত হয়েছেন। আফআর আমি বিদ্যমান উত্তরের সাথে কিছু যুক্ত করতে চাইনি তবে কেবলমাত্র আমি এপিআই ডকুমেন্টেশনের একটি অনুলিপি কোথায় পোস্ট করেছিলাম তা উল্লেখ করার জন্য, যা অন্যথায় সহজেই অ্যাক্সেসযোগ্য ছিল না।
মরিস নাফটালিন

7

আমার কাছে, যে সমাধানটি সবচেয়ে বেশি বোঝায় তা হ'ল একটি Callbackইন্টারফেসকে সংজ্ঞায়িত করা :

interface Callback {
    void call();
}

এবং তারপরে আপনি যে ফাংশনটিতে কল করতে চান তাতে এটি পরামিতি হিসাবে ব্যবহার করতে:

void somewhereInYourCode() {
    method(() -> {
        // You've passed a lambda!
        // method() is done, do whatever you want here.
    });
}

void method(Callback callback) {
    // Do what you have to do
    // ...

    // Don't forget to notify the caller once you're done
    callback.call();
}

যদিও ঠিক একটি নির্ভুলতা

ল্যাম্বদা কোনও বিশেষ ইন্টারফেস, শ্রেণি বা অন্য কোনও কিছু নয় যা আপনি নিজের দ্বারা ঘোষণা করতে পারেন। Lambdaকেবলমাত্র () -> {}বিশেষ সিনট্যাক্সকে দেওয়া নাম , যা প্যারামিটার হিসাবে একক-পদ্ধতি ইন্টারফেসগুলি পাস করার সময় আরও ভাল পঠনযোগ্যতা দেয়। এটি প্রতিস্থাপনের জন্য ডিজাইন করা হয়েছিল:

method(new Callback() {
    @Override
    public void call() {
        // Classic interface implementation, lot of useless boilerplate code.
        // method() is done, do whatever you want here.
    }
});

তাই উপরের উদাহরণে, Callbackহয় না , একটি ল্যামডা এটি শুধু একটি নিয়মিত ইন্টারফেস; lambdaআপনি এটি প্রয়োগ করতে শর্টকাট সিনট্যাক্সের নাম।


6

যে কেউ এই googling হয়, একটি ভাল পদ্ধতি ব্যবহার করা হবে java.util.function.BiConsumer। উদা:

Import java.util.function.Consumer
public Class Main {
    public static void runLambda(BiConsumer<Integer, Integer> lambda) {
        lambda.accept(102, 54)
    }

    public static void main(String[] args) {
        runLambda((int1, int2) -> System.out.println(int1 + " + " + int2 + " = " + (int1 + int2)));
    }

আউটপ্রিন্টটি হবে: 166


1
পরিবর্তে Consumer<Pair<A,B>>, BiConsumer<A,B>এই ক্ষেত্রে জন্য ব্যবহার করুন । ( ডকস )
নোবার

যে অস্তিত্ব জানত না, আমি পরবর্তী সময় ফাংশন প্যাকেজ মাধ্যমে পরীক্ষা করা উচিত।
বড়_ব্যাড_ ই

5

লাম্বডা এক্সপ্রেশনটি আর্গুমেন্ট হিসাবে পাস করা যেতে পারে argument একটি লাম্বডা এক্সপ্রেশনটি আর্গুমেন্ট হিসাবে পাস করার জন্য প্যারামিটারের ধরণ (যা আর্গুমেন্ট হিসাবে লাম্বডা এক্সপ্রেশন গ্রহণ করে) অবশ্যই কার্যকরী ইন্টারফেস প্রকারের হতে হবে।

যদি কার্যকরী ইন্টারফেস থাকে -

interface IMyFunc {
   boolean test(int num);
}

এবং একটি ফিল্টার পদ্ধতি রয়েছে যা তালিকার অন্তর্গতটি কেবল 5 এর চেয়ে বেশি হলে যুক্ত করে here সেক্ষেত্রে ল্যাম্বডা এক্সপ্রেশনটি পদ্ধতি প্যারামিটারের জন্য আর্গুমেন্ট হিসাবে পাস হতে পারে।

public class LambdaDemo {
    public static List<Integer> filter(IMyFunc testNum, List<Integer> listItems) {
        List<Integer> result = new ArrayList<Integer>();
        for(Integer item: listItems) {
            if(testNum.test(item)) {
                result.add(item);
            }
        }
        return result;
    }
    public static void main(String[] args) {
        List<Integer> myList = new ArrayList<Integer>();
        myList.add(1);
        myList.add(4);
        myList.add(6);
        myList.add(7);
        // calling filter method with a lambda expression
        // as one of the param
        Collection<Integer> values = filter(n -> n > 5, myList);

        System.out.println("Filtered values " + values);
    }
}

2

আপনি উপরে বর্ণিত হিসাবে ক্রিয়ামূলক ইন্টারফেস ব্যবহার করতে পারেন। নীচে কয়েকটি উদাহরণ দেওয়া হল

Function<Integer, Integer> f1 = num->(num*2+1);
System.out.println(f1.apply(10));

Predicate<Integer> f2= num->(num > 10);
System.out.println(f2.test(10));
System.out.println(f2.test(11));

Supplier<Integer> f3= ()-> 100;
System.out.println(f3.get());

আশা করি এটা সাহায্য করবে


1

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

যাইহোক, আপনি যদি নিজের ফাংশনাল ইন্টারফেসটি প্রয়োগ করতে চান তবে এটি তৈরি করুন। সহজ উদাহরণের জন্য:

public interface MyFunctionalInterface {
    String makeIt(String s);
}

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

public class Main {

    static void printIt(String s, MyFunctionalInterface f) {
        System.out.println(f.makeIt(s));
    }

    public static void main(String[] args) {

    }
}

আপনার শেষ কাজটি করা উচিত হ'ল মাই ফাংশনাল ইনটারফেসের প্রয়োগটি আমরা যে পদ্ধতিতে সংজ্ঞায়িত করেছি তার মধ্যে পাস করা:

public class Main {

    static void printIt(String s, MyFunctionalInterface f) {
        System.out.println(f.makeIt(s));
    }

    public static void main(String[] args) {
        printIt("Java", s -> s + " is Awesome");
    }
}

এটাই!


1

লাম্বদা কোনও বস্তু নয় বরং একটি কার্যকরী ইন্টারফেস। @FuntionalInterface কে একটি টিকা হিসাবে হিসাবে তারা ব্যবহার করতে পারে যতগুলি ফাংশনাল ইন্টারফেসকে সংজ্ঞায়িত করতে পারে

@FuntionalInterface
public interface SumLambdaExpression {
     public int do(int a, int b);
}

public class MyClass {
     public static void main(String [] args) {
          SumLambdaExpression s = (a,b)->a+b;
          lambdaArgFunction(s);
     }

     public static void lambdaArgFunction(SumLambdaExpression s) {
          System.out.println("Output : "+s.do(2,5));
     }
}

নিম্নলিখিত ফলাফল আউটপুট হবে

Output : 7

ল্যাম্বডা এক্সপ্রেশন-এর প্রাথমিক ধারণাটি আপনার নিজস্ব যুক্তিযুক্ত কিন্তু ইতিমধ্যে সংজ্ঞায়িত যুক্তিগুলি সংজ্ঞায়িত করা। সুতরাং উপরের কোডে আপনি অন্য কোনও সংজ্ঞা ছাড়াও ডু ফাংশনটির সংজ্ঞা পরিবর্তন করতে পারেন তবে আপনার যুক্তিগুলি 2 এর মধ্যে সীমাবদ্ধ।


1

মূলত একটি পরামিতি হিসাবে লামদা এক্সপ্রেশনটি পাস করার জন্য আমাদের একটি ধরণের প্রয়োজন যা আমরা এটি ধরে রাখতে পারি। শুধু একটি পূর্ণসংখ্যা মান হিসাবে আমরা আদিম রাখা int- এ বা পূর্ণসংখ্যা বর্গ। জাভাতে লামদা এক্সপ্রেশনটির জন্য পৃথক প্রকারের পরিবর্তে এটি যুক্তিটি ধরে রাখতে টাইপ হিসাবে একটি ইন্টারফেস ব্যবহার করে। তবে সেই ইন্টারফেসটি একটি কার্যকর ইন্টারফেস হওয়া উচিত ।


0

নিম্নলিখিতটি করুন ..

আপনি যা method(lambda l) করতে চান তা হ'ল নাম দিয়ে একটি ইন্টারফেস তৈরি করা lambdaএবং একটি বিমূর্ত পদ্ধতি ঘোষণা করা You

public int add(int a,int b);  

পদ্ধতির নাম এখানে গুরুত্বপূর্ণ নয় ..

সুতরাং আপনি যখন কল করবেন তখন MyClass.method( (a,b)->a+b) এই প্রয়োগকরণটি (a,b)->a+bআপনার ইন্টারফেসে যুক্ত পদ্ধতিতে ইনজেকশনের ব্যবস্থা করা হবে o সুতরাং আপনি যখনই কল করবেন l.addতখন এই প্রয়োগটি গ্রহণ করবে aএবং সংযোজন সম্পাদন করবে b এবং return l.add(2,3)ফিরে আসবে 5। - মূলত ল্যাম্বদা এটি করে ..


-1

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

import static org.util.function.Functions.*;

public class Test {

    public static void main(String[] args)
    {
        Test.invoke((a, b) -> a + b);       
    }

    public static void invoke(Func2<Integer, Integer, Integer> func)
    {
        System.out.println(func.apply(5, 6));
    }
}

package org.util.function;

public interface Functions {

    //Actions:
    public interface Action {
        public void apply();
    }

    public interface Action1<T1> {
        public void apply(T1 arg1);
    }

    public interface Action2<T1, T2> {
        public void apply(T1 arg1, T2 arg2);
    }

    public interface Action3<T1, T2, T3> {
        public void apply(T1 arg1, T2 arg2, T3 arg3);
    }

    public interface Action4<T1, T2, T3, T4> {
        public void apply(T1 arg1, T2 arg2, T3 arg3, T4 arg4);
    }

    public interface Action5<T1, T2, T3, T4, T5> {
        public void apply(T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5);
    }

    public interface Action6<T1, T2, T3, T4, T5, T6> {
        public void apply(T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6);
    }

    public interface Action7<T1, T2, T3, T4, T5, T6, T7> {
        public void apply(T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7);
    }

    public interface Action8<T1, T2, T3, T4, T5, T6, T7, T8> {
        public void apply(T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7, T8 arg8);
    }

    //Functions:
    public interface Func<TResult> {
        public TResult apply();
    }

    public interface Func1<T1, TResult> {
        public TResult apply(T1 arg1);
    }

    public interface Func2<T1, T2, TResult> {
        public TResult apply(T1 arg1, T2 arg2);
    }

    public interface Func3<T1, T2, T3, TResult> {
        public TResult apply(T1 arg1, T2 arg2, T3 arg3);
    }

    public interface Func4<T1, T2, T3, T4, TResult> {
        public TResult apply(T1 arg1, T2 arg2, T3 arg3, T4 arg4);
    }

    public interface Func5<T1, T2, T3, T4, T5, TResult> {
        public TResult apply(T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5);
    }

    public interface Func6<T1, T2, T3, T4, T5, T6, TResult> {
        public TResult apply(T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6);
    }

    public interface Func7<T1, T2, T3, T4, T5, T6, T7, TResult> {
        public TResult apply(T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7);
    }

    public interface Func8<T1, T2, T3, T4, T5, T6, T7, T8, TResult> {
        public TResult apply(T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7, T8 arg8);
    }
}

-2

পরামিতি হিসাবে ল্যাম্বদা ব্যবহার করার ক্ষেত্রে নমনীয়তা রয়েছে। এটি জাভাতে ক্রিয়ামূলক প্রোগ্রামিং সক্ষম করে। বেসিক সিনট্যাক্সটি হ'ল

পরম -> পদ্ধতি_বাবু

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

@FunctionalInterface
interface FInterface{
    int callMeLambda(String temp);
}


class ConcreteClass{

    void funcUsesAnonymousOrLambda(FInterface fi){
        System.out.println("===Executing method arg instantiated with Lambda==="));
    }

    public static void main(){
        // calls a method having FInterface as an argument.
        funcUsesAnonymousOrLambda(new FInterface() {

            int callMeLambda(String temp){ //define callMeLambda(){} here..
                return 0;
            }
        }
    }

/***********Can be replaced by Lambda below*********/
        funcUsesAnonymousOrLambda( (x) -> {
            return 0; //(1)
        }

    }

FInterface fi = (x) -> {রিটার্ন 0; };

funcUsesAnonymousOrLambda (ফাই);

এখানে উপরের দিকে এটি দেখা যায়, ল্যাম্বডা এক্সপ্রেশনটি কীভাবে কোনও ইন্টারফেসের মাধ্যমে প্রতিস্থাপন করা যায়।

উপরে ল্যাম্বডা এক্সপ্রেশনটির একটি নির্দিষ্ট ব্যবহার ব্যাখ্যা করে, আরও রয়েছে। রেফ জাভা 8 লাম্বদা একটি ল্যাম্বডারের মধ্যে বহিরাগত ল্যাম্বদা থেকে পরিবর্তনশীল পরিবর্তন করতে পারে না

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