নাল মানগুলির জন্য আমাদের কীভাবে jdk8 স্ট্রিম পরিচালনা করা উচিত


88

হ্যালো সহকর্মী জাভা বিকাশকারীরা,

আমি জানি বিষয়টি কিছুটা হতে পারে in advanceকারণ জেডিকে 8 এখনও প্রকাশিত হয়নি (এবং এখনই হয় না ..) তবে আমি ল্যাম্বদা এক্সপ্রেশন এবং বিশেষত স্ট্রিম হিসাবে পরিচিত নতুন সংগ্রহের এপিআই সম্পর্কিত অংশটি সম্পর্কে কিছু নিবন্ধ পড়ছিলাম।

এখানে জাভা ম্যাগাজিন নিবন্ধে দেওয়া উদাহরণ হিসাবে দেওয়া হয়েছে (এটি একটি উত্তম জনসংখ্যার অ্যালগরিদম ..):

Set<Otter> otters = getOtters();
System.out.println(otters.stream()
    .filter(o -> !o.isWild())
    .map(o -> o.getKeeper())
    .filter(k -> k.isFemale())
    .into(new ArrayList<>())
    .size());

আমার প্রশ্নটি হ'ল কী হবে যদি সেট অভ্যন্তরীণ পুনরাবৃত্তির মাঝখানে, কোনওটি একটি শূন্য হয়?

আমি প্রত্যাশা করব একটি নালপয়েন্টার এক্সেকশন নিক্ষেপ করা হবে তবে সম্ভবত আমি এখনও পূর্ববর্তী উন্নয়নের দৃষ্টান্তে (অ-কার্যকরী) আটকে আছি, কেউ কীভাবে আমাকে পরিচালনা করতে হবে তা আমাকে আলোকিত করতে পারে?

যদি এটি সত্যিই একটি নালপয়েন্টার এক্সেকশন ফেলে দেয় তবে আমি বৈশিষ্ট্যটি বেশ বিপজ্জনক বলে মনে করি এবং কেবল নীচের হিসাবে ব্যবহার করতে হবে:

  • কোনও নাল মান নেই তা নিশ্চিত করতে বিকাশকারী (সম্ভবত কোনও পূর্ববর্তী ফিল্টার ব্যবহার করুন (ও -> ও! = নাল))
  • অ্যাপ্লিকেশনটি কখনই নাল ওটার বা কোনও বিশেষ নুলঅটার আইটেমটি মোকাবেলা করার জন্য তৈরি করে না তা নিশ্চিত করার জন্য বিকাশকারী।

সেরা বিকল্প, বা অন্য কোনও বিকল্প কী?

ধন্যবাদ!


4
আমি বলতে চাই যে এখানে প্রোগ্রামার সঠিক কাজটি করবে; জেভিএম এবং সংকলক কেবল এত কিছু করতে পারে। মনে রাখবেন যে কয়েকটি সংগ্রহ বাস্তবায়ন নাল মানগুলিকে অনুমতি দেবে না।
fge

19
আপনি ব্যবহার করতে পারেন filter(Objects::nonNull)সঙ্গে Objectsথেকেjava.utils
Benj

উত্তর:


44

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

টনি হোয়ের নালকে "বিলিয়ন ডলারের ভুল" হিসাবে উল্লেখ করেছেন এমন কিছুই নয় for নাল সাথে ডিল করা একটি আসল ব্যথা। এমনকি ক্লাসিক সংগ্রহ সহ (ল্যাম্বডাস বা স্ট্রিম বিবেচনা না করে) নালগুলি সমস্যাযুক্ত। হিসাবে fge একটি মন্তব্যে উল্লিখিত, কিছু সংগ্রহ নাল এবং অন্যদের অনুমতি দেয় না। নালাগুলিকে মঞ্জুরি দেয় এমন সংগ্রহগুলির সাথে, এটি এপিআই-তে অস্পষ্টতার পরিচয় দেয়। উদাহরণস্বরূপ, Map.get () এর সাথে একটি নাল রিটার্নটি নির্দেশ করে যে কীটি উপস্থিত রয়েছে এবং এর মানটি শূন্য, বা কীটি অনুপস্থিত। এই কেসগুলি নিষ্পত্তি করতে একজনকে অতিরিক্ত কাজ করতে হবে।

শূন্যের জন্য সাধারণ ব্যবহার হ'ল একটি মানের অনুপস্থিতিকে বোঝানো। জাভা এসই 8 এর জন্য এই প্রস্তাবিত ব্যবসায়ের জন্য পদ্ধতির মধ্যে একটি নতুন java.util.Optionalধরণের প্রবর্তন করা হয়েছে , যা কোনও ডিফল্ট মান সরবরাহ করার আচরণের সাথে বা কোনও ব্যতিক্রম ছুঁড়ে ফেলা বা কোনও ফাংশন কল করা ইত্যাদির সাথে একটি মানের উপস্থিতি / অনুপস্থিতিকে আবদ্ধ করে if মান অনুপস্থিত। Optionalকেবলমাত্র নতুন এপিআই দ্বারা ব্যবহৃত হয়, যদিও, সিস্টেমে থাকা সমস্ত কিছু এখনও নালার সম্ভাবনাটি সহ্য করতে হয়।

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


4
নাল কেন এড়াবেন? এগুলি ডাটাবেসে ব্যাপকভাবে ব্যবহৃত হয়।
রাফি খ্যাচাডৌড়িয়ান

6
@ রাফিখাচডৌরিয়ান হ্যাঁ, ডাটাবেসগুলিতে নাল ব্যবহার করা হলেও এটি সমান সমস্যাযুক্ত। দেখুন এই এবং এই পড়া সব উত্তর এবং মন্তব্য। বুলিয়ান এক্সপ্রেশনগুলির জন্য এসকিউএল নালটির প্রভাব বিবেচনা করুন: en.wikedia.org/wiki/… ... এটি ক্যোয়ারী ত্রুটির সমৃদ্ধ উত্স।
স্টুয়ার্ট

4
@RaffiKhatchadourian কারণ nullsucks, যে কেন। অ্যাক। আমি দেখেছি একটি সমীক্ষায় (এটি খুঁজে পাচ্ছি না), এনপিই জাভাতে 1 নম্বর ব্যতিক্রম। এসকিউএল কোনও উচ্চ-স্তরের প্রোগ্রামিং ভাষা নয়, অবশ্যই কার্যকরী নয়, যা নালাকে ঘৃণা করে, তাই এটি যত্ন করে না।
অভিজিৎ সরকার

95

উত্তরগুলি 100% সঠিক হলেও Onull চ্ছিকের সাথে তালিকার কেস হ্যান্ডলিংয়ের উন্নতি করার জন্য একটি ছোট্ট পরামর্শ :

 List<String> listOfStuffFiltered = Optional.ofNullable(listOfStuff)
                .orElseGet(Collections::emptyList)
                .stream()
                .filter(Objects::nonNull)
                .collect(Collectors.toList());

অংশটি Optional.ofNullable(listOfStuff).orElseGet(Collections::emptyList)আপনাকে listOfStuffনাল হয়ে গেলে কেসটি হ্যান্ডল করার সুযোগ দেয় এবং নালপয়েন্টারএক্সসেপশন ব্যর্থ হওয়ার পরিবর্তে একটি খালি তালিকা ফিরিয়ে দেয়।


4
আমি এটি পছন্দ করি, স্পষ্টভাবে নাল পরীক্ষা করা এড়ানো হয়।
ক্রিস

4
এটি সর্বোত্তম পরিষ্কার দেখাচ্ছে .. সুন্দর এবং ঠিক আমার যা প্রয়োজন ছিল
আব্দুল্লাহ আল নোমান

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

আমি যদি একটি নাল পরিবর্তে খালি তালিকা ফিরিয়ে দিতে চাই?
অ্যাশবার্ন আর কে

@ অ্যাশবার্নআরকে এটি একটি খারাপ অভ্যাস। আপনার খালি তালিকা ফিরে আসা উচিত।
জনি

70

স্টুয়ার্টের উত্তরটি দুর্দান্ত ব্যাখ্যা দেয় তবে আমি অন্য একটি উদাহরণ দিতে চাই।

reduceনাল মান যুক্ত স্ট্রিমে একটি সম্পাদনের চেষ্টা করার সময় আমি এই ইস্যুতে দৌড়েছি (আসলে এটি ছিল LongStream.average()যা হ্রাসের এক প্রকার)। গড় () ফেরত দেওয়ার পরে OptionalDouble, আমি ধরে নিয়েছিলাম যে স্ট্রিমে নাল থাকতে পারে তবে পরিবর্তে একটি নালপয়েন্টার এক্সসেপশন নিক্ষেপ করা হয়েছে। এটি স্টুয়ার্টের নাল v। শূন্যের ব্যাখ্যার কারণে ।

সুতরাং, ওপির পরামর্শ অনুসারে, আমি এর মতো একটি ফিল্টার যুক্ত করেছি:

list.stream()
    .filter(o -> o != null)
    .reduce(..);

বা স্পর্শকৃত নীচে নির্দেশিত হিসাবে, জাভা এপিআই দ্বারা সরবরাহিত প্রাকটিকেট ব্যবহার করুন:

list.stream()
    .filter(Objects::nonNull)
    .reduce(..);

মেলিং তালিকা আলোচনা থেকে স্টুয়ার্ট লিঙ্ক করেছেন: ব্রায়ান গয়েটজ স্ট্রিমের নালায়


19

আপনি যদি কেবল একটি স্ট্রিমের বাইরে নাল মানগুলি ফিল্টার করতে চান তবে আপনি java.util.Objects.nonNull (অবজেক্ট) এর কোনও পদ্ধতি রেফারেন্স ব্যবহার করতে পারেন । এর ডকুমেন্টেশন থেকে:

এই পদ্ধতিটি ভবিষ্যদ্বাণী হিসাবে ব্যবহার করার জন্য বিদ্যমান ,filter(Objects::nonNull)

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

List<String> list = Arrays.asList( null, "Foo", null, "Bar", null, null);

list.stream()
    .filter( Objects::nonNull )  // <-- Filter out null values
    .forEach( System.out::println );

এটি মুদ্রণ করবে:

Foo
Bar

7

নাল যেমন এড়াতে পারে তার একটি উদাহরণ যেমন গ্রুপিংবিয়ের আগে ফিল্টার ব্যবহার করুন

গ্রুপিংয়ের আগে নাল দৃষ্টান্তগুলি ফিল্টার করুন।

এখানে একটি উদাহরণ

MyObjectlist.stream()
            .filter(p -> p.getSomeInstance() != null)
            .collect(Collectors.groupingBy(MyObject::getSomeInstance));
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.