Google Guava isNullOrEmpty สำหรับคอลเล็กชัน


102

ฉันเห็นว่า Guava มีวิธียูทิลิตี้ isNullOrEmpty สำหรับ Strings

Strings.isNullOrEmpty(str)

เรามีรายการที่คล้ายกันหรือไม่? สิ่งที่ต้องการ

Lists.isNullOrEmpty(list)

ซึ่งควรจะเทียบเท่ากับ

list == null || list.isEmpty()

นอกจากนี้เรามีอะไรที่คล้ายกันสำหรับ Arrays หรือไม่? สิ่งที่ต้องการ

Arrays.isNullOrEmpty(arr)

ซึ่งควรจะเทียบเท่ากับ

arr == null || arr.length == 0

คำตอบ:


141

ไม่วิธีนี้ไม่มีใน Guava และมีอยู่จริงใน "สุสานแห่งความคิด" ของเรา

เราไม่เชื่อว่า "เป็นโมฆะหรือว่างเปล่า" เป็นคำถามที่คุณอยากถามเกี่ยวกับคอลเล็กชัน

หากคอลเลกชันอาจเป็นโมฆะและควรถือเป็นโมฆะเช่นเดียวกับความว่างเปล่าให้กำจัดความคลุมเครือทั้งหมดนั้นออกไปข้างหน้าดังนี้:

Set<Foo> foos = NaughtyClass.getFoos();
if (foos == null) {
  foos = ImmutableSet.of();
}

หรือแบบนี้ (ถ้าคุณต้องการ):

Set<Foo> foos = MoreObjects.firstNonNull(
    NaughtyClass.getFoos(), ImmutableSet.<Foo>of());

หลังจากนั้นคุณก็สามารถใช้งานได้.isEmpty()ตามปกติ ทำสิ่งนี้ทันทีที่เรียก API ที่ซุกซนและคุณใส่ความแปลกประหลาดไว้ข้างหลังแทนที่จะปล่อยให้มันดำเนินต่อไปเรื่อย ๆ

และถ้า "null ซึ่งหมายถึงคอลเลกชันว่างเปล่า" ไม่ถูกส่งกลับมาให้คุณ แต่ส่งต่อให้คุณงานของคุณก็ง่ายเพียงแค่ปล่อยให้มีการNullPointerExceptionโยนและทำให้ผู้โทรคนนั้นเป็นรูปร่างขึ้น


7
จะเกิดอะไรขึ้นถ้าบางเฟรมเวิร์กตั้งค่าฟิลด์เป็นโมฆะและคุณไม่สามารถควบคุมได้ (เฟรมเวิร์กสปริงเมื่อเชื่อมโยงกับลิสต์) แม้ว่าคุณจะตั้งค่าอย่างชัดเจนและใช้รายการว่างในอ็อบเจ็กต์
OMax

15
คำตอบของฉันเหมือนกัน: พยายามลบความคลุมเครือโดยการทำให้ปกติnullเป็นคอลเล็กชันว่างโดยเร็วที่สุด ถ้าคุณทำไม่ได้ก็โอเคคุณอาจเป็นหนึ่งใน <1% ของผู้ใช้ที่ต้องการเขียนตัวช่วย isNullOrEmpty (Collection) ที่ไม่สำคัญของตัวเอง
Kevin Bourrillion

8
(หรือข้ามตัวช่วยแล้วเขียนif (collection == null || collection.isEmpty())ในกรณีที่คุณต้องการมันแย่ขนาดนั้นเลยเหรอ?)
Kevin Bourrillion

13
นี่เป็นคำตอบที่แสดงความคิดเห็นซึ่งไม่ได้ตอบคำถามจริงเลย นอกจากนี้ยังขัดต่อหลักการเขียนโปรแกรมเชิงป้องกันอีกด้วย
Neovibrant

11
@Neovibrant เนื่องจากคำถามเกี่ยวกับความสามารถของห้องสมุด Guava และคำตอบมาจากหนึ่งในผู้พัฒนาหลักของ Guava คำตอบนั้นบอกเป็นนัย ๆ ว่า: "ไม่ฝรั่งไม่มี" คำตอบอาจได้รับการปรับปรุงโดยเริ่มต้นด้วยคำพูดนั้น :)
กรุนเดิลเฟลก

37

สิ่งหนึ่งที่คุณมักจะพบตลอดฝรั่งคือพวกมันมักจะเป็นปฏิปักษ์กับnulls ผู้เขียนต้องการกีดกันคุณจากการใช้งานnullให้มากที่สุดเท่าที่จะทำได้และการจัดหาวิธียูทิลิตี้เพื่อให้ใช้งานได้ง่ายขึ้นnullจะเป็นการต่อต้านการสิ้นสุดนี้

หากคุณต้องการใช้กระบวนทัศน์ของ Guava ให้พิจารณาว่าแหล่งที่มาของคอลเล็กชันนี้ (หรืออาร์เรย์) ควรจะคืนค่าnullหรือไม่ ถ้าไม่ได้พิจารณาการทำเครื่องหมายและกลับคอลเลกชันที่ว่างเปล่าแทน@NonNull nullหรือเป็นพารามิเตอร์ของฟังก์ชันที่คาดหวังnullรายการที่ไม่มีค่าให้พิจารณาใช้Preconditions.checkNotNullซึ่งจะแสดงข้อยกเว้นหากมีการnullส่งผ่าน (โดยไม่คาดคิด)

ถ้าnullถูกต้องตามกฎหมายจริงๆlist == null || list.isEmpty()ก็ไม่ยาก


9
มันไม่สอดคล้องกัน อาร์กิวเมนต์เดียวกันอาจจะทำสำหรับสตริงยังมีเป็น Strings.isNullOrEmpty ()
ดอนชีเดิล

29

มีCollectionUtils.isEmpty ()ในคอลเลกชันคอมมอนส์


1
น่าเสียดายที่ดูเหมือนว่าจะถูกลบออกในเวอร์ชันล่าสุด ดู org.apache.commons.collections15.CollectionUtils
spaaarky21

1
ดู Javadoc จาก apache.commons.collection เมธอด isEmpty () และ isNotEmpty () ยังคงมีอยู่ในเวอร์ชันล่าสุด คอลเลกชัน 15.CollectionUtils ดูเหมือนเป็นโครงการอิสระที่พยายามให้การสนับสนุนทั่วไป
proko

1
CollectionUtils.isEmpty () มีประโยชน์เมื่อทำงานกับแอปเดิมเมื่อคุณไม่สามารถเปลี่ยนรหัสขึ้นด้านหน้าได้
Jerome Dalbert

1
เรารู้เรื่องนี้ แต่มีคนถามเกี่ยวกับฝรั่งที่ไม่เกี่ยวกับ apache commons
ถึงกระ

9

ฤดูใบไม้ผลิกรอบมีความเชี่ยวชาญ util CollectionUtilsระดับที่เรียกว่า และวิธีที่คุณกำลังมองหาคือ: org.springframework.util.CollectionUtils.isEmpty. จะคืนค่าจริงสำหรับคอลเลกชันว่างและว่างเปล่า

และสำหรับอาร์เรย์มีorg.springframework.util.ObjectUtils.isEmptyวิธีการทำงานที่ค่อนข้างเหมือนกัน


5
แม้ว่าจะใช้งานได้อย่างปลอดภัย แต่คลาสนี้จะมีความคิดเห็น "ส่วนใหญ่ใช้ภายในเฟรมเวิร์ก" ซึ่งหมายความว่าอินเทอร์เฟซของมันอาจเปลี่ยนแปลงไปในการอัปเกรด Spring และคุณจะต้องทำงานเพิ่มเติมเพื่อให้มันใช้งานได้อีกครั้ง
Mike Minicki

2

Apache CollectionUtils 4 มีเมธอดCollectionUtils.emptyIfNull ()ที่ส่งคืนรายการว่างหากคอลเลกชันเป็นโมฆะ สิ่งนี้มีประโยชน์มากใน foreach loop ดังนั้นคุณไม่จำเป็นต้องทำการตรวจสอบค่าว่างก่อนที่จะทำซ้ำ


1

ทางออกของฉันคือ MoreObjects.firstNonNull (รายการคอลเลกชัน emptyList ())

ฉันใช้ Guava MoreObjects กับ JDK Collections

 @Test
public void listnull() {
List<String> list = null;

for (String str : MoreObjects.firstNonNull(list, Collections.<String> emptyList())) {
    System.out.println(str);
}

list = new ArrayList<String>();
list.add("http://stackoverflow.com/");

for (String str : MoreObjects.firstNonNull(list, Collections.<String> emptyList())) {
    System.out.println(str);
}
}

1
นี่คือสิ่งที่แนะนำในคำตอบยอดนิยมยกเว้นคุณไม่ได้ใช้ImmutableListไฟล์.
dimo414

ฉันคิดลบเพราะคนหนึ่งต้องการวิธีแก้ปัญหาที่ง่ายและรวดเร็วเช่นวิธี apache commons ในNotEmpty ...
ถึง Kra

ศูนย์ช่วยเหลือ> สิทธิพิเศษ> โหวตลงฉันควรลงคะแนนเมื่อใด ใช้คะแนนโหวตของคุณเมื่อใดก็ตามที่คุณพบโพสต์ที่เลอะเทอะอย่างมากไม่ต้องใช้ความพยายามหรือคำตอบที่ชัดเจนและอาจไม่ถูกต้องจนเป็นอันตราย คุณมีจำนวนโหวตที่ จำกัด ต่อวันและการตอบแบบลงคะแนนทำให้คุณเสียชื่อเสียงไปเล็กน้อย ใช้อย่างชาญฉลาด stackoverflow.com/help/privileges/vote-down
jeton

คุณคิดว่าคำตอบของฉันคือ "โพสต์ที่เลอะเทอะอย่างมากไม่ต้องใช้ความพยายามหรือคำตอบที่ชัดเจนและอาจไม่ถูกต้องเป็นอันตราย" ถ้าไม่ทำไมคุณถึงโหวตลบ
jeton

0

ดูที่ Appache Collections CollectionUtils.isEmpty () จะคืนค่า true หากคอลเลกชันเป็นโมฆะหรือว่างเปล่า

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