লাম্বদা এক্সপ্রেশনগুলির কোডের সংরক্ষণের লাইন ছাড়া অন্য কোনও ব্যবহার রয়েছে?


120

লাম্বদা এক্সপ্রেশনগুলির কোডের সংরক্ষণের লাইন ছাড়া অন্য কোনও ব্যবহার রয়েছে?

ল্যাম্বডাস দ্বারা প্রদত্ত এমন কোনও বিশেষ বৈশিষ্ট্য রয়েছে যা সমস্যার সমাধান করতে সহজ ছিল না? আমি যে সাধারণ ব্যবহারটি দেখেছি তা হ'ল এটি লেখার পরিবর্তে:

Comparator<Developer> byName = new Comparator<Developer>() {
  @Override
  public int compare(Developer o1, Developer o2) {
    return o1.getName().compareTo(o2.getName());
  }
};

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

Comparator<Developer> byName =
(Developer o1, Developer o2) -> o1.getName().compareTo(o2.getName());

27
মনে রাখবেন এটি আরও খাটো হতে পারে: (o1, o2) -> o1.getName().compareTo(o2.getName())
থোরবজরন রাভন অ্যান্ডারসন

88
বা এখনও ছোট:Comparator.comparing(Developer::getName)
টমাস ক্লিগার

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

5
ল্যাম্বডাস হ'ল ক্লোজার, যা স্থানের সঞ্চয়কে আরও বড় করে তোলে, এখন থেকে আপনাকে আপনার প্রতিস্থাপন শ্রেণিতে একটি প্যারামিটারাইজড কনস্ট্রাক্টর, ক্ষেত্র, অ্যাসাইনমেন্ট কোড ইত্যাদি যুক্ত করতে হবে না।
কোডসইনচাউস

উত্তর:


116

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

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

সবচেয়ে উল্লেখযোগ্যভাবে, ল্যাম্বডা এক্সপ্রেশনগুলি স্বতন্ত্রভাবে সংজ্ঞাযুক্ত ফাংশনাল ইন্টারফেসের সাথে সংজ্ঞায়িত করা হয়েছে, সুতরাং উত্তরাধিকার সূত্রে প্রাপ্ত কোনও সদস্য নেই যা তারা অ্যাক্সেস করতে পারে, আরও, তারা ক্রিয়ামূলক ইন্টারফেস প্রয়োগের ধরণের উদাহরণ অ্যাক্সেস করতে পারে না। একটি ল্যামডা অভিব্যক্তি মধ্যেই thisএবং superপার্শ্ববর্তী প্রেক্ষাপটে হিসাবে একই অর্থ আছে, তাও দেখতে এই উত্তর । এছাড়াও, আপনি আশেপাশের প্রসঙ্গে স্থানীয় ভেরিয়েবলকে ছায়ায় নতুন স্থানীয় ভেরিয়েবল তৈরি করতে পারবেন না। কোনও ফাংশন সংজ্ঞায়িত করার উদ্দেশ্যে কাজটি করার জন্য এটি প্রচুর ত্রুটি উত্সগুলি সরিয়ে দেয়, তবে এটি আরও বোঝায় যে অন্যান্য ব্যবহারের ক্ষেত্রে বেনামে অভ্যন্তরীণ শ্রেণিগুলি থাকতে পারে যা ল্যাম্বডা এক্সপ্রেশনে রূপান্তরিত করা যায় না, এমনকি যদি একটি কার্যকরী ইন্টারফেস প্রয়োগ করেও।

তদ্ব্যতীত, new Type() { … }নির্মাণটি একটি নতুন স্বতন্ত্র উদাহরণ উত্পাদন করার গ্যারান্টি দেয় ( newসর্বদা হিসাবে )। অজ্ঞাতনামা অভ্যন্তরীণ বর্গের দৃষ্টান্তগুলি সর্বদা তাদের বাহ্যিক দৃষ্টান্তের সাথে একটি staticপ্রাসঙ্গিক ক্ষেত্রে তৈরি করা হলে একটি রেফারেন্স রাখে । বিপরীতে, ল্যাম্বডা এক্সপ্রেশনগুলি কেবল thisযখন প্রয়োজন হয় তখন একটি রেফারেন্স ক্যাপচার করে , যেমন যদি তারা অ্যাক্সেস করে thisবা কোনও staticসদস্য নয়। এবং তারা একটি ইচ্ছাকৃতভাবে অনির্ধারিত পরিচয়ের উদাহরণ তৈরি করে যা বাস্তবায়নগুলি রান-টাইমের সময়ে বিদ্যমান দৃষ্টান্তগুলি পুনরায় ব্যবহার করতে হবে কিনা তা স্থির করতে অনুমতি দেয় (এছাড়াও দেখুন " লাম্বডা এক্সপ্রেশনটি প্রতিবার কার্যকর হওয়ার সময় কীভাবে কোনও বস্তু তৈরি করে? ")।

এই মতভেদগুলি আপনার উদাহরণের জন্য প্রযোজ্য। আপনার বেনামে অভ্যন্তরীণ বর্গ গঠন সর্বদা একটি নতুন উদাহরণ তৈরি করবে, এটি বাইরের উদাহরণের জন্য একটি রেফারেন্স ক্যাপচার করতে পারে, তবে আপনার (Developer o1, Developer o2) -> o1.getName().compareTo(o2.getName())এটি একটি নন-ক্যাপচারিং ল্যাম্বডা এক্সপ্রেশন যা সাধারণ বাস্তবায়নে একককে মূল্যায়ন করবে। আরও, এটি .classআপনার হার্ড ড্রাইভে কোনও ফাইল তৈরি করে না ।

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


1
মূলত, ল্যাম্বডা এক্সপ্রেশনগুলি এক ধরণের ক্রিয়ামূলক প্রোগ্রামিং। প্রদত্ত যে কোনও কাজ কার্যকরী প্রোগ্রামিং বা অত্যাবশ্যক প্রোগ্রামিং দিয়ে করা যায়, পাঠযোগ্যতা এবং রক্ষণাবেক্ষণযোগ্যতা ব্যতীত কোনও সুবিধা নেই , যা অন্যান্য উদ্বেগকে ছাড়িয়ে যেতে পারে।
ড্রাকো

1
@ ট্র্যারিলিয়ন: আপনি ফাংশন সংজ্ঞা দিয়ে পুরো বই পূরণ করতে পারে । আপনার লক্ষ্যটি বা জাভা ল্যাম্বডা এক্সপ্রেশন দ্বারা সমর্থিত দিকগুলির দিকে মনোনিবেশ করতে হবে কিনা তাও আপনাকে সিদ্ধান্ত নিতে হবে । আমার উত্তরের শেষ লিঙ্কটি ( এটি একটি ) ইতিমধ্যে জাভা প্রসঙ্গে এই দিকগুলির কয়েকটি নিয়ে ইতিমধ্যে আলোচনা করে। তবে আমার উত্তরটি বোঝার জন্য, এটি বোঝার জন্য ইতিমধ্যে যথেষ্ট যে ফাংশনগুলি ক্লাসগুলির চেয়ে আলাদা ধারণা। আরও বিশদের জন্য, ইতিমধ্যে বিদ্যমান সংস্থান এবং প্রশ্নোত্তর হিসাবে রয়েছে…
হোলগার

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

3
@ এরিকডুমিনিল: আমার কাছে ট্যুরিং সম্পূর্ণতা তাত্ত্বিক। উদাহরণস্বরূপ, জাভা টিউরিং সম্পূর্ণ কিনা বা না, আপনি জাভাতে উইন্ডোজ ডিভাইস ড্রাইভার লিখতে পারবেন না। (অথবা পোস্টস্ক্রিপ্টে, যা সম্পূর্ণ ট্যুরিওর সম্পূর্ণ) জাভাতে এমন বৈশিষ্ট্য যুক্ত করা যা এটি করার অনুমতি দেয় তবে এটির মাধ্যমে আপনি যে সমস্যার সমাধান করতে পারেন সেগুলির সেট বদলে যাবে, তবে তা হবে না। সুতরাং আমি সমাবেশ পয়েন্টটি পছন্দ করি; যেহেতু আপনি যা কিছু করতে পারেন তা এক্সিকিউটেবল সিপিইউ নির্দেশিকায় কার্যকর করা হয়, তাই বিধানসভায় আপনি কিছুই করতে পারেননি যা প্রতিটি সিপিইউ নির্দেশকে সমর্থন করে (টুরিং মেশিনের আনুষ্ঠানিকতার চেয়ে বোঝাও সহজ)।
23:58

2
@ আবেলিটো সমস্ত উচ্চ স্তরের প্রোগ্রামিং কনস্ট্রাক্টগুলিতে সাধারণ , কম "বাস্তবে যা চলছে তার দিকে দৃষ্টিপাত" সরবরাহ করার জন্য, যা বাস্তব বিষয়গুলিই কম তথ্য, প্রকৃত প্রোগ্রামিং সমস্যাটির উপর আরও ফোকাস। কোডটি আরও ভাল বা খারাপ করতে আপনি এটি ব্যবহার করতে পারেন; এটি কেবল একটি সরঞ্জাম। ভোটিং ফিচারের মতো; এটি এমন একটি সরঞ্জাম যা আপনি কোনও পোস্টের আসল গুণমান সম্পর্কে একটি প্রতিষ্ঠিত রায় প্রদানের উদ্দেশ্যে, অভিযুক্ত উপায়ে ব্যবহার করতে পারেন। বা আপনি এটিকে একটি বিশদযুক্ত, যুক্তিসঙ্গত উত্তরকে কমিয়ে দেওয়ার জন্য ব্যবহার করেছেন, কেবলমাত্র লাম্বদাসকে ঘৃণা করার কারণে।
হোলার

52

প্রোগ্রামিং ভাষাগুলি মেশিনগুলি কার্যকর করার জন্য নয়।

তারা প্রোগ্রামারদের চিন্তা করার জন্য ।

ভাষাগুলি একটি মেশিন চালিত করতে পারে এমন কিছুতে আমাদের চিন্তাভাবনাগুলিকে রূপান্তর করতে সংকলকের সাথে কথোপকথন। প্রধান যেসব লোকেরা অন্য ভাষায় থেকে এটা আসা (অথবা থেকে জাভা সম্পর্কে অভিযোগ এক ছেড়ে এটা জন্য এটি ব্যবহার করা হয় অন্য ভাষায়) বাধ্য করে প্রোগ্রামার উপর একটি নির্দিষ্ট মানসিক মডেল (অর্থাত সবকিছু একটি ক্লাস হয়)।

আমি এটি ভাল বা খারাপ কিনা তা বিবেচনা করতে যাচ্ছি না: সবকিছুই ট্রেড অফ। কিন্তু জাভা 8 lambdas প্রোগ্রামারদের করার অনুমতি দেয় মনে পরিপ্রেক্ষিতে ফাংশন , যা কিছু আপনি পূর্বে জাভা না পারে।

এটি একটি পদ্ধতিগত প্রোগ্রামার শেখার হিসাবে একই জিনিস মনে শ্রেণীর পদ যখন তারা জাভা আসুন: আপনি দেখতে তাদের ধীরে ধীরে ক্লাস মহিমান্বিত structs মধ্যে এবং স্ট্যাটিক পদ্ধতি একটি গুচ্ছ সঙ্গে 'সাহায্যকারী' ক্লাস আছে থেকে সরানো এবং কিছু যে উপর সরানো আরও নিবিড়ভাবে যুক্তিযুক্ত ওও ডিজাইনের সাথে মিল রয়েছে (মেয়া কুলপা)।

আপনি যদি কেবল তাদের বেনামি অভ্যন্তরীণ ক্লাসগুলি প্রকাশ করার জন্য একটি ছোট্ট উপায় হিসাবে মনে করেন তবে আপনি সম্ভবত তাদের খুব প্রভাবশালী দেখতে পাচ্ছেন না যে উপরের পদ্ধতিগত প্রোগ্রামার সম্ভবত ক্লাসগুলির কোনও দুর্দান্ত উন্নতি বলে মনে করেনি।


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

3
অন্য কথায়, ওওপি-তে চিন্তা করা , কেবলমাত্র অন্য সরঞ্জাম হিসাবে * ও এফ * ক্লাসগুলি ভাবার চেয়ে , আপনি আমার চিন্তাভাবনাটিকে খারাপ উপায়ে সীমাবদ্ধ করেছিলেন।
ব্যবহারকারী 253751

2
@ এমমিবিস: "ওওপিতে চিন্তা" করার বিভিন্ন উপায় রয়েছে, সুতরাং "ক্লাসে চিন্তা" করার সাথে "ওওপিতে চিন্তাভাবনা" বিভ্রান্ত করার সাধারণ ভুল ছাড়াও পাল্টা উত্পাদনশীল উপায়ে চিন্তা করার প্রচুর উপায় রয়েছে। দুর্ভাগ্যক্রমে, শুরু থেকে খুব প্রায়ই ঘটে থাকে, এমনকি বই এবং টিউটোরিয়ালগুলি নিকৃষ্টতরদের শেখায়, উদাহরণগুলিতে বিরোধী নিদর্শন দেখায় এবং সেই চিন্তাভাবনা ছড়িয়ে দেয়। ধারণা করা দরকার যে "যাবতীয় ধরণের জন্য একটি শ্রেণি থাকা", যা কেবলমাত্র একটি উদাহরণ, বিমূর্ত ধারণার বিপরীতে, একইভাবে, "ওওপি মানে যতটা সম্ভব বয়লারপ্লেট লেখা" মিথ, ইত্যাদি
হোলার

@ এমমিবিস যদিও এই পরিস্থিতিতে এটি আপনাকে সহায়তা করে নি, যে উপাখ্যানটি আসলে এই বিষয়টিকে সমর্থন করে: ভাষা এবং দৃষ্টান্ত আপনার চিন্তাগুলি গঠনের এবং তাদের নকশায় রূপান্তর করার জন্য একটি কাঠামো সরবরাহ করে। আপনার ক্ষেত্রে আপনি কাঠামোর প্রান্তগুলির বিরুদ্ধে দাঁড়িয়েছিলেন, কিন্তু অন্য প্রসঙ্গে এটি আপনাকে কাদামাটির একটি বড় বলের দিকে ভ্রষ্ট হতে এবং কুৎসিত নকশা তৈরি করতে সহায়তা করতে পারে। অতএব, আমি ধরে নিই, "সবকিছুই বাণিজ্য বন্ধ"। কোনও ভাষা কীভাবে "বড়" করা উচিত তা সিদ্ধান্ত নেওয়ার সময় পূর্ববর্তী সমস্যাটিকে এড়িয়ে চলাকালীন পরবর্তী সুবিধা বজায় রাখা একটি মূল প্রশ্ন।
লিউশেনকো

@ এমমিবিস এ কারণেই একগুচ্ছ দৃষ্টান্ত ভালভাবে শেখা জরুরী : প্রত্যেকে অন্যের অপ্রতুলতা সম্পর্কে আপনার কাছে পৌঁছে যায়।
জারেড স্মিথ

36

কোডের সংরক্ষণের লাইনগুলি একটি নতুন বৈশিষ্ট্য হিসাবে দেখা যেতে পারে, যদি এটি আপনাকে যুক্তিগুলির একটি বৃহত্তর অংশকে আরও স্বল্প ও স্বচ্ছভাবে লিখতে সক্ষম করে, যা অন্যদের পড়তে ও বুঝতে কম সময় নেয়।

ল্যাম্বডা এক্সপ্রেশন (এবং / অথবা পদ্ধতির উল্লেখ) ছাড়া Streamপাইপলাইনগুলি খুব কম পঠনযোগ্য হত।

উদাহরণস্বরূপ, চিন্তা করুন, নীচের Streamপাইপলাইনটি কেমন লাগলে যদি আপনি প্রতিটি ল্যাম্বডা এক্সপ্রেশনটি কোনও বেনাম শ্রেণীর উদাহরণ দিয়ে প্রতিস্থাপন করেন।

List<String> names =
    people.stream()
          .filter(p -> p.getAge() > 21)
          .map(p -> p.getName())
          .sorted((n1,n2) -> n1.compareToIgnoreCase(n2))
          .collect(Collectors.toList());

এটি হবে:

List<String> names =
    people.stream()
          .filter(new Predicate<Person>() {
              @Override
              public boolean test(Person p) {
                  return p.getAge() > 21;
              }
          })
          .map(new Function<Person,String>() {
              @Override
              public String apply(Person p) {
                  return p.getName();
              }
          })
          .sorted(new Comparator<String>() {
              @Override
              public int compare(String n1, String n2) {
                  return n1.compareToIgnoreCase(n2);
              }
          })
          .collect(Collectors.toList());

ল্যাম্বডা এক্সপ্রেশন সহ সংস্করণটির চেয়ে এটি লেখার পক্ষে আরও কঠিন এবং এটি আরও অনেক ত্রুটিযুক্ত প্রবণ। এটি বোঝাও শক্ত।

এবং এটি তুলনামূলকভাবে সংক্ষিপ্ত পাইপলাইন।

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


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

Nitpick: আপনি আসলে প্রয়োজন হবে না Comparatorজন্য sortedযেমন যাহাই হউক না কেন প্রাকৃতিক অনুক্রমে তুলনা করা হয়। উদাহরণস্বরূপ আরও ভাল করে তুলতে, স্ট্রিংয়ের দৈর্ঘ্যের সাথে তুলনা করতে বা এর অনুরূপ পরিবর্তন করুন?
tobias_k

@ টোবিয়াস_ কে সমস্যা নেই আমি এটিকে পরিবর্তিত করেছি compareToIgnoreCaseএটির চেয়ে আলাদা আচরণ করার জন্য sorted()
ইরান

1
compareToIgnoreCaseএখনও একটি খারাপ উদাহরণ, যেমন আপনি কেবল বিদ্যমান String.CASE_INSENSITIVE_ORDERতুলনামূলকটি ব্যবহার করতে পারেন । @ টোবিয়াস_ক এর দৈর্ঘ্যের সাথে তুলনা করার পরামর্শ (বা বিল্ট-ইন তুলনাকারী না থাকা অন্য কোনও সম্পত্তি) আরও ভাল ফিট করে। এসও প্রশ্নোত্তর কোড উদাহরণ দ্বারা বিচার করে, ল্যাম্বডাস প্রচুর অপ্রয়োজনীয় তুলনামূলক বাস্তবায়ন ঘটায় ...
হোলার

আমিই কি একমাত্র মনে করি যে দ্বিতীয় উদাহরণটি বোঝা সহজ?
ক্লার্ক যুদ্ধ

8

অভ্যন্তরীণ পুনরাবৃত্তি

যখন জাভা সংগ্রহগুলি iterating, সবচেয়ে ডেভেলপারদের ঝোঁক পেতে একটি উপাদান এবং তারপর প্রক্রিয়া এটা। এটি হ'ল item জিনিসটি বাইরে নিয়ে যান এবং তারপরে এটি ব্যবহার করুন, বা এটি পুনরায় সন্নিবেশ করান, ইত্যাদি জাভা-এর প্রাক -8 সংস্করণ সহ আপনি একটি অভ্যন্তর শ্রেণি প্রয়োগ করতে পারেন এবং এর মতো কিছু করতে পারেন:

numbers.forEach(new Consumer<Integer>() {
    public void accept(Integer value) {
        System.out.println(value);
    }
});

এখন জাভা 8 এর সাহায্যে আপনি আরও ভাল এবং কম ভার্বোস এর সাথে করতে পারেন:

numbers.forEach((Integer value) -> System.out.println(value));

বা আরও ভাল

numbers.forEach(System.out::println);

যুক্তি হিসাবে আচরণ

নিম্নলিখিত কেসটি অনুমান করুন:

public int sumAllEven(List<Integer> numbers) {
    int total = 0;

    for (int number : numbers) {
        if (number % 2 == 0) {
            total += number;
        }
    } 
    return total;
}

জাভা 8 প্রেডিকেট ইন্টারফেসের মাধ্যমে আপনি এর মতো আরও ভাল করতে পারেন:

public int sumAll(List<Integer> numbers, Predicate<Integer> p) {
    int total = 0;

    for (int number : numbers) {
        if (p.test(number)) {
            total += number;
        }
    }
    return total;
}

এটিকে কল করা:

sumAll(numbers, n -> n % 2 == 0);

উত্স: ডি জোন - জাভাতে কেন আমাদের ল্যাম্বডা এক্সপ্রেশন দরকার


সম্ভবত প্রথম কেস কোডের কয়েকটি লাইন সংরক্ষণের একটি উপায়, তবে কোডটি পড়া সহজ করে তোলে
আলসেথার

4
অভ্যন্তরীণ পুনরাবৃত্তি একটি ল্যাম্বদা বৈশিষ্ট্য কীভাবে? সহজ ব্যাপারটি প্রযুক্তিগতভাবে ল্যাম্বডাস আপনাকে এমন কিছু করতে দেয় না যা আপনি জাভা -8 এর আগে করতে পারেননি। চারপাশে কোড পাসের এটি আরও একটি সংক্ষিপ্ত উপায়।
Ousmane D.

@ Aominè এই ক্ষেত্রে numbers.forEach((Integer value) -> System.out.println(value));ল্যামডা অভিব্যক্তি দুটি অংশ এক তৈরি করা হয় বাম (->) তার তালিকা তীর প্রতীকের পরামিতি এবং এর এক ডান এতে থাকা শরীর । সংকলকটি স্বয়ংক্রিয়ভাবে সনাক্ত করে যে ল্যাম্বডা এক্সপ্রেশনটিতে গ্রাহক ইন্টারফেসের একমাত্র বাস্তবায়ন না করা পদ্ধতির একই স্বাক্ষর রয়েছে।
alseether

5
ল্যাম্বডা এক্সপ্রেশন কী তা আমি জিজ্ঞাসা করিনি, আমি কেবল বলছি যে ল্যাম্বডা এক্সপ্রেশনগুলির সাথে অভ্যন্তরীণ পুনরাবৃত্তির কোনও সম্পর্ক নেই।
Ousmane D.

1
@ আমিনো è আমি আপনার বক্তব্যটি দেখছি, এতে প্রতি ল্যাম্বডাসের সাথে কিছুই নেই , তবে আপনি যেমনটি উল্লেখ করেছেন, এটি আরও রচনার ক্লিনার মতো। আমি মনে করি দক্ষতার দিক থেকে প্রাক-8 সংস্করণ হিসাবে ভাল
আলসেটর

4

নীচের হিসাবে নীচের হিসাবে অন্তর্ভুক্ত শ্রেণীর পরিবর্তে ল্যাম্বডাস ব্যবহারের অনেক সুবিধা রয়েছে:

  • আরও ভাষার সিনট্যাক্স শব্দার্থবিজ্ঞানের পরিচয় না দিয়ে কোডটি আরও সংক্ষিপ্ত এবং অভিব্যক্তিপূর্ণ করুন। আপনি ইতিমধ্যে আপনার প্রশ্নের একটি উদাহরণ দিয়েছেন।

  • ল্যাম্বডাস ব্যবহার করে আপনি উপাদানগুলির স্ট্রিমে ক্রিয়ামূলক-শৈলীর ক্রিয়াকলাপে প্রোগ্রামিং করতে খুশি হন যেমন সংগ্রহের উপর মানচিত্র-হ্রাস রূপান্তর। দেখতে java.util.function & java.util.stream প্যাকেজ ডকুমেন্টেশন।

  • সংকলক দ্বারা ল্যাম্বডাসের জন্য কোনও শারীরিক ক্লাস ফাইল নেই। সুতরাং এটি আপনার বিতরণ করা অ্যাপ্লিকেশনগুলিকে আরও ছোট করে। ল্যাম্বডাকে মেমোরি কীভাবে বরাদ্দ করে?

  • সংকলক ল্যাম্বডা সৃষ্টিটি অনুকূল করে তুলবে যদি ল্যাম্বদা তার সুযোগের বাইরে ভেরিয়েবল অ্যাক্সেস না করে, যার অর্থ ল্যাম্বডা উদাহরণটি কেবল একবার JVM দ্বারা তৈরি করা হয়। আরও তথ্যের জন্য আপনি @ হোলারের প্রশ্নের উত্তর দেখতে পাবেন যে পদ্ধতি রেফারেন্সটি জাভা 8-তে একটি ভাল ধারণা ক্যাশে করছে?

  • লাম্বদাস ফাংশনাল ইন্টারফেস ছাড়াও একাধিক চিহ্নিতকারী ইন্টারফেস প্রয়োগ করতে পারে, তবে বেনামে অভ্যন্তরীণ শ্রেণিগুলি আরও ইন্টারফেস প্রয়োগ করতে পারে না, উদাহরণস্বরূপ:

    //                 v--- create the lambda locally.
    Consumer<Integer> action = (Consumer<Integer> & Serializable) it -> {/*TODO*/};

2

লাম্বদাস বেনাম শ্রেণীর জন্য কেবল সিনট্যাকটিক চিনি।

ল্যাম্বডাসের আগে বেনামে ক্লাস একই জিনিস অর্জন করতে ব্যবহার করা যেতে পারে। প্রতিটি ল্যাম্বডা এক্সপ্রেশন একটি বেনাম শ্রেণিতে রূপান্তরিত হতে পারে।

আপনি যদি ইন্টেলিজ আইডিইএ ব্যবহার করেন তবে এটি আপনার জন্য রূপান্তরটি করতে পারে:

  • লাম্বদাতে কার্সার রাখুন
  • Alt / অপশন + এন্টার টিপুন

এখানে চিত্র বর্ণনা লিখুন


3
... আমি ভেবেছিলাম @ স্টার্টমার্কস ইতিমধ্যে ল্যাম্বডাসের সিনট্যাকটিক চিনি-আইটি (এসপি? জিআর?) পরিষ্কার করেছেন? ( Stackoverflow.com/a/15241404/3475600 , softwareengineering.stackexchange.com/a/181743 )
srborlongan

2

আপনার প্রশ্নের উত্তর দিতে, আসলে ব্যাপার lambdas হয় না আপনি কিছু যে আপনি জাভা-8 পূর্বে যেত না করতে দেওয়া, বরং এটা তুমি কি আরও লিখতে সক্ষম সংক্ষিপ্ত কোড। এর সুবিধাগুলি হ'ল আপনার কোডটি আরও পরিষ্কার এবং আরও নমনীয় হবে।


স্পষ্টতই @ হোলার ল্যাম্বডা দক্ষতার দিক থেকে কোনও সন্দেহকে ছড়িয়ে দিয়েছেন। কোড ক্লিনার করার জন্য এটি কেবল একটি উপায় নয়, তবে
ল্যাম্বদা

আপনি যদি গভীরভাবে খনন করেন তবে প্রতিটি ভাষার বৈশিষ্ট্যের মধ্যে একটি পার্থক্য রয়েছে। হাতের প্রশ্নটি একটি উচ্চ স্তরের, তাই আমি আমার উত্তরটি একটি উচ্চ স্তরে লিখেছি।
Ousmane D.

2

একটি জিনিস যা আমি এখনও উল্লেখ করি না তা হ'ল একটি ল্যাম্বদা আপনাকে যেখানে এটি ব্যবহার করা হয়েছে কার্যকারিতা সংজ্ঞায়িত করতে দেয়

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


1

হ্যাঁ অনেক সুবিধা আছে।

  • পুরো ক্লাসটি সংজ্ঞায়িত করার দরকার নেই আমরা রেফারেন্স হিসাবে এটি নিজেই ফাংশন বাস্তবায়ন পাস করতে পারি।
    • অভ্যন্তরীণভাবে ক্লাস তৈরির ফলে .class ফাইল তৈরি হবে যখন আপনি ল্যাম্বদা ব্যবহার করেন তবে ক্লাস তৈরিটি কম্পাইলার দ্বারা এড়ানো হবে কারণ ল্যাম্বডায় আপনি ক্লাসের পরিবর্তে ফাংশন বাস্তবায়ন পাস করছেন।
  • কোড পুনরায় ব্যবহারের আগের চেয়ে বেশি হয়
  • এবং যেমনটি আপনি বলেছিলেন কোডটি ছোট হয় তখন সাধারণ বাস্তবায়ন।
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.