লুপের জন্য বর্ধিত চেকটি নাল চেক করুন


172

জাভাতে লুপের জন্য নাল থেকে রক্ষা করার সর্বোত্তম উপায় কী?

এটি কুরুচিপূর্ণ বলে মনে হচ্ছে:

if (someList != null) {
    for (Object object : someList) {
        // do whatever
    }
}

অথবা

if (someList == null) {
    return; // Or throw ex
}
for (Object object : someList) {
    // do whatever
}

অন্য কোনও উপায় নাও থাকতে পারে। তাদের উচিত কি এটি forনিজেই নির্মাণে রাখা উচিত , যদি এটি নাল হয় তবে লুপটি চালাবেন না?


2
আপনি সম্ভবত এনপিই নিক্ষেপ করা থেকে ভাল better nullখালি সংগ্রহের মতো নয়।
টম হাটিন -

6
@ গ্রেগম্যাটস ফেব্রুয়ারি প্রশ্নটি অক্টোবরের প্রশ্নের নকল কীভাবে?
Val,

1
কেবল কালেকশনস.ননলিটমেন্টসআইএন (...) ব্যবহার করা দরকার: স্ট্যাকওভারফ্লো.com
জেফ্রি ডিলি

উত্তর:


227

আপনি তালিকাটি কোথা থেকে পেয়েছেন তা আরও ভালভাবে যাচাই করা উচিত।

খালি তালিকা আপনার যা দরকার তা হ'ল কারণ একটি খালি তালিকা ব্যর্থ হবে না।

আপনি যদি অন্য কোথাও এই তালিকাটি পেয়ে থাকেন এবং এটি ঠিক আছে কিনা তা জানেন না বা না আপনি কোনও ইউটিলিটি পদ্ধতি তৈরি করতে এবং এটি ব্যবহার করতে পারেন:

for( Object o : safe( list ) ) {
   // do whatever 
 }

এবং অবশ্যই safeহবে:

public static List safe( List other ) {
    return other == null ? Collections.EMPTY_LIST : other;
}

57
নোট করুন যে সংগ্রহ.ইম্পটিলিস্ট () কোনও অতিরিক্ত অবজেক্ট (আইআইআরসি) বরাদ্দ এড়াবে।
জন স্কিটি

7
@ জোন: আমি সর্বদা আমার নিজেকে জিজ্ঞাসা করেছি, that জাভা.সুন.com/j2se/1.5.0/docs/api/java/util/… emptyList আইআরআইসি কি?
অস্কাররাজ

11
আইআইআরসি = "যদি আমি সঠিকভাবে স্মরণ করি"। এবং হ্যাঁ, একটি একক দৃষ্টান্ত রয়েছে যা কালেকশন.ইম্পটিলিস্টে () সমস্ত কলের জন্য ফিরে আসে।
কলিনড

এটি ... আসলে প্রশ্নের উত্তর দেয় না। কেন এটি উত্তর গৃহীত হয়?
ক্রিস্টোফার রাইট 21

1
@ ক্রিস্টোফার ওয়ার্ট কারণ এটি প্রশ্নের উত্তর দেয়: ডি
তারিক

100

আপনি সম্ভাব্যভাবে কোনও সহায়ক পদ্ধতি লিখতে পারেন যা আপনি শূন্যপদে পাস করলে খালি অনুক্রমটি ফিরে আসে:

public static <T> Iterable<T> emptyIfNull(Iterable<T> iterable) {
    return iterable == null ? Collections.<T>emptyList() : iterable;
}

তারপরে ব্যবহার করুন:

for (Object object : emptyIfNull(someList)) {
}

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


3
আমি পুনরুদ্ধারযোগ্য <T> তালিকার প্যারামিটারকে Iterable <T> পুনরাবৃত্তিতে পরিবর্তন করব, কারণ প্রতিটি পুনরাবৃত্তিযোগ্য একটি তালিকা নয়।
লোম্বো

এই পদ্ধতিটি ব্যবহারে সতর্কতা অবলম্বন করুন: সংগ্রহ শ্রেণীর ব্যবহারের কারণে, এই পদ্ধতির ব্যবহারে আপনার তালিকা জড়িত হতে পারে
ট্যানরিক্স

@ ট্যানোরিক্স: কীভাবে?
জন স্কিটি

@ জোনস্কিট আপনি সংগ্রহ ক্লাসের খালি তালিকা () দেখতে পারবেন একটি অপরিবর্তনীয় তালিকা: ডকস.ওরাকল.com / javase / 8 / docs / api / java / util/… তাই যদি ব্যবহারকারী তার তালিকাটি অপরিবর্তনীয় রাখতে না চান তবে সমস্যাযুক্ত
হোন

@ ট্যানোরিক্স: তবে এই প্রশ্নের বিন্দুটি প্রত্যাবর্তিত মানকে নিয়ে পুনরাবৃত্তি করা সম্পর্কে । এটি এটি পরিবর্তন করে না। এই কারণেই রিটার্নের ধরনটি emptyIfNullহ'ল Iterable<T>- দুর্ভাগ্যজনক removeপদ্ধতিটি রয়েছে Iterator<T>তবে এটির একমাত্র পরিবর্তনীয় দিক (এবং যদি আপনি একটি খালি সংগ্রহ পেয়ে থাকেন তবে কেন আপনি এটি থেকে কোনও কিছু সরিয়ে দেওয়ার চেষ্টা করছেন?) আপনি কী জানেন তা পরিষ্কার নয় ' এখানে আপত্তি করছি।
জন স্কিটি

29

এটি ইতিমধ্যে 2017, এবং আপনি এখন অ্যাপাচি কমন্স সংগ্রহগুলি 4 ব্যবহার করতে পারেন

ব্যবহার:

for(Object obj : ListUtils.emptyIfNull(list1)){
    // Do your stuff
}

আপনি অন্যান্য সংগ্রহ ক্লাসে একই নাল-নিরাপদ চেক করতে পারেন CollectionUtils.emptyIfNull


2
অপ্রয়োজনীয় তালিকা অবজেক্ট তৈরি করলেও কাজ করবে work একটি কালেকশন ইউটিস.আইফনোটম্পিটি আরও ভার্বোজ হতে পারে তবে আরও দক্ষ এবং দ্রুত। এটি যে খুব বেশি গুরুত্বপূর্ণ তা নয় ...
লরেন্স

2
2017 এ আমি লিস্ট.ইম্পটিআইফনুল (তালিকা 1) আশা করব
ডিমা

3
@ লরেন্স, পদ্ধতিটি নতুন তালিকার অবজেক্ট তৈরি করে না, এটি Collections.emptyList()অভ্যন্তরীণভাবে ব্যবহার করে, যা সর্বদা একই পূর্বনির্ধারিত খালি অশোধিতযোগ্য তালিকা প্রদান করে।
ইওরি এন।

আপনি যদি myobject.getCompanies ()। GetAdd્રેસ () কল করেন এবং উভয়ই একটি তালিকা ফিরিয়ে দেন এবং উভয়ই শূন্য হতে পারে?
গুঁড়া366

9

জাভা 8 সহ Optional:

for (Object object : Optional.ofNullable(someList).orElse(Collections.emptyList())) {
    // do whatever
}

1
এটি সাধারণ টার্নারি অপারেটরের চেয়ে আরও বেশি ভার্বোজের মতো someList != null ? someList : Collections.emptyList()তৈরি করে এবং অবিলম্বে Optionalঅবজেক্টের একটি উদাহরণ নিক্ষেপ করে ।
ইয়ুরি এন।

2
কীভাবে এই দৈত্য রেখাগুলি সরল (কিছুList == নাল) স্টেটমেন্টের চেয়ে আরও মার্জিত হয়। আসুন এক লাইনে একটি ব্যাঙ্ক অ্যাপ্লিকেশন লিখি ...
Andreas Panagiotidis

8

অ্যারে জন্য গ্রন্থাগার ArrayUtils.nullToEmptyথেকে ব্যবহার করুনcommons-lang

for( Object o : ArrayUtils.nullToEmpty(list) ) {
   // do whatever 
}

এই কার্যকারিতাটি commons-langলাইব্রেরিতে বিদ্যমান রয়েছে , যা বেশিরভাগ জাভা প্রকল্পের অন্তর্ভুক্ত।

// ArrayUtils.nullToEmpty source code 
public static Object[] nullToEmpty(final Object[] array) {
    if (isEmpty(array)) {
        return EMPTY_OBJECT_ARRAY;
    }
    return array;
}

// ArrayUtils.isEmpty source code
public static boolean isEmpty(final Object[] array) {
    return array == null || array.length == 0;
}

এই @OscarRyz কর্তৃক প্রদত্ত উত্তর হিসাবে একই, কিন্তু অনুরোধে জন্য শুকনো মন্ত্রোচ্চারণের, আমি বিশ্বাস করি না বুঝেই মূল্য। দেখুন Commons-ল্যাঙ প্রকল্পের পাতা। এখানে nullToEmptyএপিআই ডকুমেন্টেশন এবং উত্স

commons-langআপনার প্রকল্পে এটি ইতিমধ্যে না থাকলে অন্তর্ভুক্ত করার জন্য মাভেন এন্ট্রি ।

<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-lang3</artifactId>
    <version>3.4</version>
</dependency>

দুর্ভাগ্যক্রমে, ধরণের commons-langজন্য এই কার্যকারিতা সরবরাহ করে না List। এই ক্ষেত্রে আপনাকে পূর্বে উল্লিখিত হিসাবে একটি সহায়ক পদ্ধতি ব্যবহার করতে হবে।

public static <E> List<E> nullToEmpty(List<E> list)
{
    if(list == null || list.isEmpty())
    {
        return Collections.emptyList();
    }
    return list;
}

7

আপনি যদি Listপ্রয়োগ করেন এমন কোনও কল কল থেকে যদি তা পেয়ে থাকেন তবে ফিরে আসবেন না null, খালি ফিরে আসুন List

আপনি যদি বাস্তবায়ন পরিবর্তন করতে না পারেন তবে আপনি nullচেকের সাথে আটকে রয়েছেন । যদি এটি না হয় null, তবে একটি ব্যতিক্রম নিক্ষেপ করুন।

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


4

আমি উপরের উত্তরটি পরিবর্তন করেছি, সুতরাং আপনাকে অবজেক্ট থেকে কাস্ট করার দরকার নেই

public static <T> List<T> safeClient( List<T> other ) {
            return other == null ? Collections.EMPTY_LIST : other;
}

এবং তারপরে কেবল তালিকাটিকে কল করে

for (MyOwnObject ownObject : safeClient(someList)) {
    // do whatever
}

ব্যাখ্যা: মাইওনওবজেক্ট: যদি List<Integer>তবে মায়োউনঅবজেক্ট এই ক্ষেত্রে পূর্ণসংখ্যা হবে।


1

লুপের জন্য Optional<T>শূন্যতা থেকে কার্যকরভাবে রক্ষা করার আরেকটি উপায় হ'ল গুগল পেয়ারা এর সাথে আপনার সংগ্রহটি গুটিয়ে রাখা , এক আশা, কার্যকর খালি সংগ্রহের সম্ভাবনা পরিষ্কার হয়ে যায় যেহেতু ক্লায়েন্টের কাছ থেকে সংগ্রহ উপস্থিত রয়েছে কিনা তা পরীক্ষা করা উচিত বলে আশা করা যায় Optional.isPresent()


1

যে কেউ নিজের স্ট্যাটিক নাল সুরক্ষা পদ্ধতি লেখার জন্য আগ্রহী নয় তাদের জন্য আপনি ব্যবহার করতে পারেন: কমন্স-ল্যাং এর org.apache.commons.lang.ObjectUtils.defaultIfNull(Object, Object)। উদাহরণ স্বরূপ:

    for (final String item : 
    (List<String>)ObjectUtils.defaultIfNull(items, Collections.emptyList())) { ... }

অবজেক্ট ইউটিস.ডেফোল্ট আইফনুল জাভাডোক


আমার জন্য, এই উত্তরটি সবচেয়ে মার্জিত
Truong Nguyen

0

CollectionUtils.isEmpty(Collection coll)নির্দিষ্ট সংগ্রহটি খালি কিনা তা ব্যবহার করুন, যা নাল-সেফ চেক।

এই জন্য import org.apache.commons.collections.CollectionUtils

মাভেন নির্ভরতা

<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-collections4</artifactId>
    <version>4.0</version>
</dependency>

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