ল্যাম্বডা এক্সপ্রেশনটি প্রতিবার কার্যকর হওয়ার সময় গাদাতে কোনও বস্তু তৈরি করে?


182

যখন আমি জাভা 8 এর নতুন সিনট্যাকটিক চিনি ব্যবহার করে কোনও সংগ্রহের মাধ্যমে পুনরাবৃত্তি করি

myStream.forEach(item -> {
  // do something useful
});

এটি নীচে 'পুরানো বাক্য গঠন' স্নিপেটের সমতুল্য নয়?

myStream.forEach(new Consumer<Item>() {
  @Override
  public void accept(Item item) {
    // do something useful
  }
});

এর অর্থ কি Consumerপ্রতিবার আমি সংগ্রহের সাথে পুনরাবৃত্তি করবার সময় স্তূপে একটি নতুন বেনামে তৈরি বস্তু তৈরি হয়? এটি কত গাদা স্থান নেয়? এটির কার্য সম্পাদনের কী কী প্রভাব আছে? এর অর্থ কি বড় মাল্টি-লেভেল ডেটা স্ট্রাকচারের উপরে পুনরাবৃত্তি করার সময় লুপগুলির জন্য আমার পুরানো স্টাইলটি ব্যবহার করা উচিত?


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

উত্তর:


158

এটি সমতুল্য তবে অভিন্ন নয়। সহজভাবে বলেছিলেন, যদি ল্যাম্বডা এক্সপ্রেশন মানগুলি ক্যাপচার না করে তবে এটি একটি সিঙ্গলটন হবে যা প্রতিটি অনুরোধে পুনরায় ব্যবহৃত হয়।

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

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


এটি জাভা ভাষা স্পেসিফিকেশন, অধ্যায় " 15.27.4 দ্বারা আচ্ছাদিত হয়েছে ল্যাম্বদা এক্সপ্রেশনগুলির রান-টাইম মূল্যায়ন "

সংক্ষিপ্ত:

এই নিয়মগুলি জাভা প্রোগ্রামিং ভাষার বাস্তবায়নের ক্ষেত্রে নমনীয়তা সরবরাহ করার জন্য বোঝানো হয়েছে:

  • প্রতিটি মূল্যায়নের জন্য একটি নতুন অবজেক্ট বরাদ্দ করা দরকার না।

  • বিভিন্ন ল্যাম্বডা এক্সপ্রেশন দ্বারা উত্পাদিত অবজেক্টগুলি বিভিন্ন শ্রেণীর অন্তর্ভুক্ত নয় (উদাহরণস্বরূপ যদি দেহগুলি অভিন্ন হয়)।

  • মূল্যায়নের মাধ্যমে উত্পাদিত প্রতিটি বস্তুর একই শ্রেণীর অন্তর্ভুক্ত হওয়া উচিত নয় (উদাহরণস্বরূপ ক্যাপচারিত স্থানীয় ভেরিয়েবলগুলি অন্তর্ভুক্ত করা যেতে পারে)।

  • যদি "বিদ্যমান উদাহরণ" উপলভ্য থাকে তবে এটি আগের ল্যাম্বডা মূল্যায়নে তৈরি করার দরকার নেই (উদাহরণস্বরূপ এটি ঘেরের ক্লাসের প্রারম্ভিককরণের সময় বরাদ্দ করা হতে পারে)।


24

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

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

এখানে বিষয়ের একটি ভাল, অ্যাক্সেসযোগ্য গভীর নিবন্ধ:

http://www.infoq.com/articles/Java-8-Lambdas-A-Peek-Under-the-Hood


0

আপনি forEachপদ্ধতিতে একটি নতুন উদাহরণ পাস করছেন । যতবার আপনি এটি করেন আপনি প্রতিটি লুপ পুনরাবৃত্তির জন্য একটি নয় তবে একটি নতুন অবজেক্ট তৈরি করেন। forEachলুপ দিয়ে সম্পন্ন না করা অবধি একই 'কলব্যাক' অবজেক্ট ইনস্ট্যান্স ব্যবহার করে মেথডের ভিতরে আইট্রেশন করা হয় ।

সুতরাং লুপ দ্বারা ব্যবহৃত স্মৃতি সংগ্রহের আকারের উপর নির্ভর করে না।

এটি কি 'পুরানো বাক্য গঠন' স্নিপেটের সমতুল্য নয়?

হ্যাঁ. এটি খুব নিম্ন স্তরে সামান্য পার্থক্য রয়েছে তবে আমার মনে হয় না যে আপনার তাদের যত্ন নেওয়া উচিত। লাম্বা এক্সপ্রেশনগুলি বেনাম শ্রেণীর পরিবর্তে চালিত বৈশিষ্ট্যটি ব্যবহার করে।


এটি নির্দিষ্ট করে কোন ডকুমেন্টেশন আছে? এটি বেশ আকর্ষণীয় অপ্টিমাইজেশন।
এ রমা

ধন্যবাদ, তবে আমার যদি সংগ্রহের সংগ্রহ আছে তবে উদাহরণস্বরূপ যখন কোনও ট্রি ডেটাস্ট্রাক্টারে গভীরতা-প্রথম অনুসন্ধান করার সময়?
বাসটিয়ান ভয়েগট

2
@ এ রামা দুঃখিত, আমি অপটিমাইজেশন দেখছি না। ল্যাম্বডাসের সাথে বা ছাড়াই এবং ফর লুপের সাথে বা ছাড়াই এটি একই।
aalku

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

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