วิธีปฏิบัติที่ดีที่สุดในการตรวจสอบความถูกต้องของคอลเลกชันที่ว่างเปล่าใน Java


210

nullฉันต้องการที่จะตรวจสอบไม่ว่าจะเป็นคอลเลกชันที่ว่างเปล่าและ ใครช่วยได้โปรดแจ้งให้ฉันทราบวิธีปฏิบัติที่ดีที่สุด

ขณะนี้ฉันกำลังตรวจสอบด้านล่าง:

if (null == sampleMap || sampleMap.isEmpty()) {
  // do something
} 
else {
  // do something else
}

10
นอกเหนือจากสิ่งอื่นคิดเกี่ยวกับเหตุผลที่คุณใช้มากกว่าnull == sampleMap sampleMap == nullคนส่วนใหญ่พบว่าหลังอ่านได้มากขึ้น - อดีตคือการครอบครองจากภาษาอื่น ๆ
Jon Skeet

6
อย่างไรก็ตามคอลเลกชัน null ไม่ดี ถ้าเป็นไปได้ให้ทำให้มันว่างแทน See Effective Java: Item 43 - Return empty arrays or collections, not nulls.
远声远 Shengyuan Lu

คน @JonSkeet ใช้ null == sampleMap ในกรณีที่พวกเขาเขียน = แทนที่จะเป็น == ถ้าคุณใช้ sampleMap == null เมื่อคุณลืมหนึ่ง = มันจะกลายเป็น sampleMap = null ซึ่งจะไม่เพิ่มข้อผิดพลาดดังนั้นการเขียนจึงเป็นวิธีอื่นที่ช่วยให้นักพัฒนาเห็น
Uri Loya

1
@UriLoya: หากคุณเขียนif (null = sampleMap)ใน Java คุณจะได้รับข้อผิดพลาดในการรวบรวม นั่นเป็นประเด็นของความคิดเห็นแรกของฉันอย่างแม่นยำ ว่า "เหตุผล" เพราะมันเป็นภาษาเฉพาะ แต่ได้รับการแพร่กระจายไปยังภาษาอื่น ๆ แม้จะมีโทษอ่านเพราะคนยังไม่ได้พิจารณาว่าทำไมพวกเขากำลังทำนั้น
Jon Skeet

คุณสามารถใช้คลาส CollectionUtils ซึ่งมีอยู่ในแพ็คเกจ org.apache.commons.collections4.CollectionUtils มีวิธีอรรถประโยชน์มากมายเพื่อค้นหาว่างเปล่าหรือเป็นโมฆะ
vikash

คำตอบ:


313

หากคุณใช้ไลบรารีApache Commons Collectionsในโครงการของคุณคุณสามารถใช้CollectionUtils.isEmptyและMapUtils.isEmpty()วิธีการที่ตรวจสอบว่าชุดสะสมหรือแผนที่ว่างเปล่าหรือเป็นโมฆะตามลำดับหรือไม่

รหัสที่อยู่เบื้องหลังวิธีการเหล่านี้จะมากหรือน้อยกว่าสิ่งที่ผู้ใช้ @ icza ได้เขียนไว้ในคำตอบของเขา

ไม่ว่าคุณจะทำอะไรโปรดจำไว้ว่ายิ่งคุณเขียนรหัสน้อยลงเท่าไหร่คุณจะต้องทดสอบรหัสน้อยลงเมื่อความซับซ้อนของรหัสลดลง


1
ขอบคุณ MapUtils.isEmpty เป็นโซลูชั่นที่สมบูรณ์แบบที่จะตรวจสอบแผนที่เป็นโมฆะหรือเปล่า
Narayan Yerrabachu

23
isNullOrEmptyมันน่าเสียดายที่พวกเขาไม่ได้ตั้งชื่อ
Scadge

73

นั่นเป็นวิธีที่ดีที่สุดในการตรวจสอบ คุณสามารถเขียนวิธีช่วยได้:

public static boolean isNullOrEmpty( final Collection< ? > c ) {
    return c == null || c.isEmpty();
}

public static boolean isNullOrEmpty( final Map< ?, ? > m ) {
    return m == null || m.isEmpty();
}

จะต้องมีฟังก์ชั่นที่คล้ายกันMap<?>เช่นกัน
Luiggi Mendoza

1
แน่นอนว่าคุณสามารถเพิ่มหนึ่งแผนที่ได้ด้วย แต่ชื่อระบุไว้ในคอลเล็กชัน
icza

1
ฉันไม่เข้าใจว่า m เป็นโมฆะแล้ว isempty () จะทำให้ NullPointerException rigth ใช่หรือไม่ มิฉะนั้นถ้าด้านซ้าย (m == ว่าง) เป็นจริงแล้วส่วนที่เหลือจะไม่ถูกตรวจสอบ
อิสมาอิลซาฮิน

4
@ismail ||ผู้ประกอบการเป็นผู้ดำเนินการลัดวงจรหมายถึงถ้าตัวถูกดำเนินการด้านซ้ายtrueมันจะไม่ประเมินตัวถูกดำเนินการที่เหมาะสม ดังนั้นถ้าm == nullไปแล้วm.isEmpty()จะไม่ถูกเรียก (ไม่จำเป็นต้องใช้ผลที่ได้คือtrue)
icza

โซลูชันที่สมบูรณ์แบบ @icza
gaurav

32

หากคุณใช้ Spring framework คุณสามารถใช้CollectionUtilsเพื่อตรวจสอบกับทั้ง Collections (List, Array) และ Map เป็นต้น

if(CollectionUtils.isEmpty(...)) {...}

บางทีคุณพูดถึง MapUtils.isEmpty () สำหรับ Map แต่ไม่ใช่สำหรับคอลเลคชั่นทั้งหมดใช่ไหม
Pavlo Chechehov

21

โดยส่วนตัวแล้วฉันชอบที่จะใช้คอลเลกชันที่ว่างเปล่าแทนnullและให้อัลกอริทึมทำงานในลักษณะที่ว่าอัลกอริทึมนั้นไม่สำคัญว่าคอลเลกชันนั้นจะว่างเปล่าหรือไม่


10

เมื่อคุณใช้สปริงคุณก็สามารถใช้

boolean isNullOrEmpty = org.springframework.util.ObjectUtils.isEmpty(obj);

โดยที่ obj เป็น [แผนที่, คอลเลกชัน, อาร์เรย์, สิ่งใด ๆ ... ]

มิฉะนั้น: รหัสคือ:

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

public static boolean isEmpty(Object obj) {
    if (obj == null) {
        return true;
    }

    if (obj.getClass().isArray()) {
        return Array.getLength(obj) == 0;
    }
    if (obj instanceof CharSequence) {
        return ((CharSequence) obj).length() == 0;
    }
    if (obj instanceof Collection) {
        return ((Collection) obj).isEmpty();
    }
    if (obj instanceof Map) {
        return ((Map) obj).isEmpty();
    }

    // else
    return false;
}

สำหรับ String ที่ดีที่สุดคือ:

boolean isNullOrEmpty = (str==null || str.trim().isEmpty());

3

หากคุณต้องการตรวจสอบค่าว่างนั่นเป็นวิธี อย่างไรก็ตามหากคุณสามารถควบคุมสิ่งนี้ได้เพียงส่งคืนคอลเล็กชันว่างเปล่าเมื่อใดก็ตามที่คุณทำได้และตรวจสอบว่าว่างเปล่าในภายหลัง

เธรดนี้เกี่ยวข้องกับสิ่งเดียวกันกับ C # แต่หลักการใช้กับจาวาอย่างเท่าเทียมกัน เช่นเดียวกับที่กล่าวถึงที่นั่น null ควรถูกส่งคืนถ้า

  • null อาจหมายถึงบางสิ่งที่เฉพาะเจาะจงมากขึ้น
  • API (สัญญา) ของคุณอาจบังคับให้คุณส่งคืน null

3

คุณสามารถใช้org.apache.commons.lang.Validate's ' notEmpty ' วิธีการ:

Validate.notEmpty(myCollection)-> ตรวจสอบว่าการรวบรวมอาร์กิวเมนต์ที่ระบุไม่เป็นโมฆะหรือขนาดเป็นศูนย์ (ไม่มีองค์ประกอบ) มิฉะนั้นจะส่งข้อยกเว้น


1

เราจะตรวจสอบว่าวัตถุการรวบรวมว่างเปล่าเป็นโมฆะหรือไม่ วิธีการเหล่านี้ทั้งหมดที่ได้รับด้านล่างมีอยู่ใน org.apache.commons.collections4.CollectionUtils แพ็คเกจ

ตรวจสอบรายชื่อหรือกำหนดประเภทของวัตถุการเก็บรวบรวม

CollectionUtils.isEmpty(listObject);
CollectionUtils.isNotEmpty(listObject);

ตรวจสอบแผนที่ประเภทของวัตถุ

MapUtils.isEmpty(mapObject);
MapUtils.isNotEmpty(mapObject);

ประเภทผลตอบแทนของวิธีการทั้งหมดคือบูลีน


-1

สำหรับคอลเลกชันทั้งหมดรวมถึงการใช้แผนที่: isEmptyวิธีการที่มีอยู่ในวัตถุที่รวบรวมเหล่านี้ แต่คุณต้องทำการตรวจสอบ null ก่อน:

Map<String, String> map;

........
if(map!=null && !map.isEmpty())
......
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.