ল্যাম্বডা এক্সপ্রেশনটি কি একক পদ্ধতিতে বেনামে অভ্যন্তর শ্রেণীর চেয়ে আরও কিছু বেশি?


40

জাভা 8 এ দীর্ঘ প্রতীক্ষিত ল্যাম্বডা এক্সপ্রেশন সহ একটি নতুন হাইপ রয়েছে; তারা 3 টি কত শীতল সে সম্পর্কে তাদের সাথে প্রতি 3 দিন অন্য আর্টিকেল উপস্থিত হয়।

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

এটি জানার পরে, লাম্বদা এক্সপ্রেশনগুলি জাভাতে কেবল একটি সিনট্যাকটিক চিনির চেয়ে আরও কিছু আনতে চলেছে? আমি কি আরও শক্তিশালী এবং নমনীয় শ্রেণিবদ্ধ বা ল্যাম্বডা এক্সপ্রেশন সহ অন্যান্য অবজেক্ট-ভিত্তিক কনস্ট্রাক্টগুলি তৈরি করতে পারি যা বর্তমান ভাষার বৈশিষ্ট্যগুলি দিয়ে নির্মিত সম্ভব নয়?


30
যখন কোনও ভাষা টুরিং-সম্পূর্ণ হয়, তখন প্রতিটি যুক্ত বৈশিষ্ট্য তাত্ত্বিকভাবে "সিনট্যাকটিক চিনি" হিসাবে বর্ণনা করা যেতে পারে।
ফিলিপ

34
@ ফিলিপ: এটা ভুল সিনট্যাকটিক চিনির সংজ্ঞা প্রদানের বৈশিষ্ট্য হ'ল ডিজুগারিং নিখুঁতভাবে স্থানীয় এবং প্রোগ্রামটির বৈশ্বিক কাঠামো পরিবর্তন করে না। এমন অনেকগুলি বৈশিষ্ট্য রয়েছে যা কেবলমাত্র স্থানীয় রূপান্তর দ্বারা প্রয়োগ করা যায় না। উদাহরণস্বরূপ, আপনি যদি একটি অনুমানমূলক ভাষা গ্রহণ করেন যা জাভা হিসাবে অভিন্ন তবে সঠিক লেজ কলগুলির সাথে, পুরো প্রোগ্রামটিকে বিশ্বব্যাপী রূপান্তর না করেই "খাঁটি" জাভাতে টেল কলগুলি desugar করা সম্ভব হবে না।
Jörg ডব্লু মিটাগ

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

1
@ জর্জিও: এবং তাদের কী আলাদা শব্দার্থকতা রয়েছে?
ব্যবহারকারী 102008

2
@Giorgio: হ্যাঁ, কিন্তু রূপান্তর thisমধ্যে OuterClass.thisবেনামী শ্রেণীর মধ্যে ল্যামডা এক্সপ্রেশন ডি sugaring প্রক্রিয়ার অংশ।
ব্যবহারকারী 102008

উত্তর:


47

tl; dr: যদিও এটি বেশিরভাগ সিনট্যাকটিক চিনিযুক্ত, সেই উত্তম সিনট্যাক্স প্রচুর জিনিসকে ব্যবহারিক করে তোলে যা ধনুর্বন্ধনী এবং বন্ধনীগুলির অবিরাম, অপঠনযোগ্য লাইনে শেষ হত to

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

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

তবে যদিও সেই সমস্ত প্রযুক্তিগত কৌশলটি আকর্ষণীয় এবং প্রাসঙ্গিক (যেহেতু এটি ভবিষ্যতে জেভিএমের অপ্টিমাইজেশনের অনুমতি দেয়!), আসল উপকারটি সিনট্যাকটিক চিনির অংশটি "কেবল" "

পড়তে সহজ কি:

myCollection.map(new Mapper<String,String>() {
  public String map(String input) {
    return new StringBuilder(input).reverse().toString();
  }
});

বা:

myCollection.map(element -> new StringBuilder(element).reverse().toString());

বা (ল্যাম্বদার পরিবর্তে একটি পদ্ধতি হ্যান্ডেল ব্যবহার করে):

myCollection.map(String::toUpperCase);

আপনি শেষ পর্যন্ত একটি সংক্ষিপ্ত উপায়ে প্রকাশ করতে পারবেন যা পূর্বে 5 টি লাইন কোড (যার মধ্যে 3 একেবারে বিরক্তিকর) হতে পারে তা ব্যবহারিক (যা সম্ভব তা নয়, মঞ্জুর করা হয়েছে) এর আসল পরিবর্তন নিয়ে আসে ।


1
আমি সিনট্যাক্স চিনির অংশের সাথে পুরোপুরি একমত; আমার প্রশ্নটি লম্বা এক্সপ্রেশন দিয়ে কেবল নতুন অবজেক্ট-ভিত্তিক নির্মাণ সম্পর্কে ছিল; সর্বোপরি জাভা হ'ল একটি অবজেক্ট-ভিত্তিক ভাষা language জেনেরিকের সাথে তুলনা করে দেখুন এবং কীভাবে তারা জাভাতে অনেক নমনীয়তা কিনেছিলেন, এগুলি ছাড়া তাদের নমনীয়তা নমনীয়।
m3th0dman

7
@ এম3 থিডিডম্যান: আসলে জেনারিকগুলি কোনও নতুন ক্ষমতা যোগ করেনি। এ Listযে কোনও অবজেক্ট ধরে রাখতে পারে, একটি List<String>"কেবল" স্ট্রিং ধরে রাখতে পারে। জেনারিকস একটি সীমাবদ্ধতা যুক্ত করেছে (এবং বিধিনিষেধ আনুষ্ঠানিক করার বিকল্প!), পাওয়ার বাড়ানো নয়। জাভা 1.1 সাল থেকে সিনট্যাকটিক চিনি থেকে বেশ অনেক কিছুই। এবং এটি অগত্যা কোনও খারাপ জিনিস নয়।
জোছিম সৌর

3
@ এম3 থিডিডম্যান: আসলে জেনারিকরা কোনও নতুন ক্ষমতা যোগ করেনি, কারণ জাভাতে তারা কেবল একটি সিনট্যাকটিক চিনি। একজন List<String>শুধু একটি হল Listকাস্ট সঙ্গে Stringকিছু রিটার্ন মান প্রায় এখনো যোগ করেনি। তবুও এগুলি অত্যন্ত কার্যকর এবং ভাষাকে লেখার পক্ষে আরও সুবিধাজনক করে তুলেছে L ল্যাম্বডাস একই রকম ক্ষেত্রে।
জান হুডেক

3
আসলে এটি কেবল সিনট্যাকটিক চিনির চেয়ে অনেক বেশি। কার্যকারিতাটির বেশিরভাগই ইনভোকাডাইনামিক বাইটকোড + টাইপ ইনফারেন্স সিস্টেমটিতে বেশ কয়েকটি দুর্দান্ত অগ্রগতির মাধ্যমে জেভিএমে প্রথম শ্রেণির নাগরিক হিসাবে প্রয়োগ করা হয় implemented এটি বেনামে অভ্যন্তরীণ শ্রেণি হিসাবে প্রয়োগ করা হয়নি।
মার্টিজন ভার্বার্গ

1
@ জানহুদেক: ভাল, তারা সিনট্যাকটিক চিনির চেয়ে কিছুটা বেশি, কারণ সংকলক আসলে তাদের সম্মান করে। রানটাইম তাদের সম্পর্কে গ্রাহ্য না করে, যে সত্যি।
জোছিম সৌর

14

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

যাইহোক, লাম্বডা এক্সপ্রেশনগুলি আসলে এটিই নয়। আনুষ্ঠানিকতায় যেখানে এগুলি ব্যান্ডওয়াগন জঙ্গলের পরিবর্তে স্থানীয় ধারণা হয়, ল্যাম্বডাস হ'ল মৌলিক বিল্ডিং ব্লক; তাদের বাক্য গঠন এবং তাদের প্রতি মানুষের মনোভাব উভয়ই আলাদা। কম্পিউটার প্রোগ্রামগুলির স্ট্রাকচার এবং ব্যাখ্যায় ল্যাম্বডাসের সম্পূর্ণরূপে তৈরি একটি বেনাম পুনরাবৃত্ত ফাংশনের উদাহরণ আপনার গণনার সম্পূর্ণ ধারণাটি পরিবর্তন করতে সক্ষম। (তবে, আমি পুরোপুরি নিশ্চিত যে প্রোগ্রামটি শেখার উপায়টি মূলধারার সাফল্যের গল্প হয়ে ওঠার জন্য কেবল বৌদ্ধিক to


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

"জাম্প-অন-ব্যান্ডওয়াগন বিপর্যয়" এর জন্য +1: আমি প্রায়শই ভাবছি যে কিছু ভাষা কেন অন্যান্য জনপ্রিয় ভাষাগুলির নকল করতে থাকে এবং প্রোগ্রামাররা কেন এটি ব্যবহার করে। আমি ল্যাম্বডাস পছন্দ করি এবং এগুলি স্কেলা, লিস্প, হাস্কেলগুলিতে প্রচুর ব্যবহার করি তবে জাভা বা সি ++ এ তারা অন্য ভাষায় জনপ্রিয় হয়ে ওঠার কারণে ভাষার প্রতি অনুধাবনের মতো মনে হয়।
জর্জিও

2

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


1
ডাউনভোট কেন? আমি যা বলেছিলাম তা সম্পূর্ণ সঠিক
ব্যবহারকারী 102008

আপনি যা লিখছেন তা জাভা ল্যাম্বডাসের পক্ষে যুক্তিসঙ্গত প্রস্তাব বলে মনে হচ্ছে তবে এই প্রস্তাবটি অন্য একটির পক্ষে বাতিল করা হয়েছে ( doanduyhai.wordpress.com/2012/07/12/… )।
জর্জিও

1
@ জর্জিও: আমি কিছুতেই "প্রস্তাব" দিচ্ছি না। কী, ঠিক, আমি যা বলেছিলাম তাতে আপনি একমত নন? হ্যাঁ, অভিব্যক্তির অভ্যন্তরটি অন্যরকম দেখতে পাবেন, উদাহরণস্বরূপ আমরা একটি পদ্ধতি যুক্ত করব এবং হ্যাঁ, thisরূপান্তর করতে হবে OuterClass.this। এটি আমি যা বলেছিলাম তার বিরোধিতা করে না - প্রতিটি ল্যাম্বডা এক্সপ্রেশনকে এই অভিব্যক্তির বাইরে কোনও পরিবর্তন না করে অর্থহীন-সমতুল্য বেনাম শ্রেণীর অভিব্যক্তিতে রূপান্তর করা যেতে পারে । আমি বলিনি যে ভিতরে পরিবর্তন হবে না।
ব্যবহারকারী 102008

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

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

1

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


-1

না তারা না.

এটি রাখার আরেকটি উপায় হ'ল লম্বডাস হ'ল একটি অন-অবজেক্ট-ভিত্তিক, তবে সংক্ষিপ্তভাবে, একই জিনিস অর্জনের উপায় যা কোনও বেনাম শ্রেণি বা, আমার পছন্দ, অভ্যন্তর শ্রেণি কোনও অবজেক্ট-ভিত্তিক উপায়ে অর্জন করবে।


1
ফাংশনাল প্রোগ্রামিং অবজেক্ট ওরিয়েন্টেড প্রোগ্রামিংয়ের জন্য সম্পূর্ণ orthogonal হতে পারে (দেখুন: স্কালা এবং এফ #)। এটি এমন কারও মতামতের মতো পড়ে যিনি কেবল নীতির ভিত্তিতে কার্যকরী প্রোগ্রামিংকে অপছন্দ করেন।
কেচালাক্স

1
@ কেচালাক্স - একটি কার্যকরী প্রোগ্রামিং বিদ্বেষী নয়। উত্তরটি হ্যামারড্রাইভারের চেয়ে হাতুড়ি এবং স্ক্রু ড্রাইভারের পক্ষে পছন্দ করে এমন কেউ লিখেছেন। ফাংশনাল প্রোগ্রামিংয়ের মতো ওও প্রোগ্রামিং একটি ভাল দৃষ্টান্ত। কোনও ভাষায় আমার পছন্দ এটির উদ্দেশ্য সম্পর্কে পরিষ্কার হওয়া for লাম্বদাস আমি জাভা অন্যথায় O প্রকৃতির জঞ্জাল মনে হয়। জাভা একটি কার্যকরী ভাষা হিসাবে নকশা করা হয়নি। মানুষের সর্বোত্তম কাজ করার জন্য কাঠামোর প্রয়োজন।
গুইডো আনসেলমি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.