Google Guava isNullOrEmpty cho bộ sưu tập


102

Tôi thấy rằng Guava có phương thức tiện ích isNullOrEmpty cho Chuỗi

Strings.isNullOrEmpty(str)

Chúng tôi có bất kỳ điều gì tương tự cho Danh sách? Cái gì đó như

Lists.isNullOrEmpty(list)

phải tương đương với

list == null || list.isEmpty()

Ngoài ra, chúng ta có bất kỳ điều gì tương tự cho Mảng không? Cái gì đó như

Arrays.isNullOrEmpty(arr)

phải tương đương với

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

Câu trả lời:


141

Không, phương pháp này không tồn tại ở Guava và thực tế là trong "nghĩa địa ý tưởng" của chúng tôi.

Chúng tôi không tin rằng "trống hay rỗng" là câu hỏi mà bạn thực sự muốn hỏi về một bộ sưu tập.

Nếu một tập hợp có thể là null và null phải được coi giống như rỗng, thì hãy loại bỏ tất cả sự mơ hồ đó ra phía trước, như sau:

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

hoặc như thế này (nếu bạn thích):

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

Sau đó, bạn có thể sử dụng .isEmpty()như bình thường. Làm điều này ngay lập tức khi gọi API nghịch ngợm và bạn đã đặt sự kỳ lạ sau lưng mình, thay vì để nó tiếp tục vô thời hạn.

Và nếu "null thực sự có nghĩa là bộ sưu tập trống" không được trả lại cho bạn mà được chuyển cho bạn, công việc của bạn rất dễ dàng: chỉ cần NullPointerExceptionném một lệnh và làm cho người gọi đó định hình.


7
Điều gì sẽ xảy ra nếu một số khuôn khổ đang đặt trường nó thành null và bạn không thể kiểm soát nó (khuôn khổ mùa xuân khi được liên kết với danh sách) mặc dù bạn đặt và sử dụng danh sách trống trong đối tượng một cách rõ ràng.
OMax

15
Câu trả lời của tôi là giống nhau: cố gắng loại bỏ sự mơ hồ bằng cách chuẩn hóa nullthành một bộ sưu tập trống ngay khi bạn có thể. Nếu bạn không thể, thì không sao, bạn có thể là một trong số <1% người dùng thực sự muốn viết trình trợ giúp isNullOrEmpty (Bộ sưu tập) tầm thường của riêng họ.
Kevin Bourrillion

8
(hoặc bỏ qua trình trợ giúp và chỉ viết if (collection == null || collection.isEmpty())trong những trường hợp bạn cần! Điều đó thật tệ phải không?)
Kevin Bourrillion

13
Đây là một câu trả lời cố ý mà không thực sự giải quyết được câu hỏi. Nó cũng đi ngược lại các nguyên tắc lập trình phòng thủ.
Neovibrant

11
@Neovibrant vì câu hỏi là về các khả năng của thư viện Guava và câu trả lời là từ một trong những nhà phát triển chính của Guava, câu trả lời là ngụ ý: "Không, Guava không có". Câu trả lời có thể được cải thiện bằng cách bắt đầu với tuyên bố rằng mặc dù :)
Grundlefleck

37

Một điều bạn sẽ có xu hướng tìm thấy trên khắp Ổi là chúng có xu hướng rất đối nghịch với nulls. Các tác giả muốn không khuyến khích bạn sử dụng nullnhiều như bạn có thể làm, và cung cấp các phương pháp tiện ích để giúp bạn sử dụng dễ dàng hơn nullsẽ phản tác dụng đối với mục đích này.

Nếu bạn muốn sử dụng mô hình của Guava, hãy cân nhắc xem nguồn của bộ sưu tập (hoặc mảng) này có thực sự nên tùy chọn trả về hay không null. Nếu không, hãy xem xét đánh dấu nó @NonNullvà trả về các bộ sưu tập trống thay vì null. Hoặc như một tham số cho một hàm đang mong đợi nulldanh sách không có giá trị, hãy cân nhắc sử dụng Preconditions.checkNotNull, điều này sẽ ném ra một ngoại lệ nếu a nullđược truyền vào (bất ngờ).

Nếu nullthực sự là hợp pháp, list == null || list.isEmpty()không phải là khó.


9
nó không nhất quán. Các lập luận tương tự có thể được thực hiện cho Strings, nhưng vẫn có một Strings.isNullOrEmpty ()
Don Cheadle

29

Có một CollectionUtils.isEmpty () trong commons-collection.


1
Thật không may, nó dường như đã bị loại bỏ trong các phiên bản gần đây hơn. Xem org.apache.commons.collections15.CollectionUtils.
spaaarky21

1
Nhìn vào Javadoc từ apache.commons.collection, các phương thức isEmpty () và isNotEmpty () vẫn tồn tại trong phiên bản mới nhất. 15.CollectionUtils có vẻ như là một dự án độc lập đang cố gắng cung cấp hỗ trợ chung.
proko 13:12

1
CollectionUtils.isEmpty () hữu ích khi làm việc với các ứng dụng cũ, khi bạn không thể thay đổi mã phía trước.
Jerome Dalbert

1
chúng tôi biết điều này, nhưng một người hỏi về ổi không phải về apache commons.
Đến Kra

9

Spring Framework có lớp sử dụng chuyên biệt được gọi là CollectionUtils. Và phương pháp mà bạn đang tìm kiếm là: org.springframework.util.CollectionUtils.isEmpty. Nó trả về true cho các tập hợp rỗng và rỗng.

Và đối với mảng, có một org.springframework.util.ObjectUtils.isEmptyphương thức hoạt động khá giống nhau.


5
Mặc dù nó có thể an toàn để sử dụng, nhưng lớp này được đánh dấu bằng chú thích "Chủ yếu để sử dụng nội bộ trong khuôn khổ". Điều này có nghĩa là giao diện của nó có thể thay đổi khi nâng cấp Spring và bạn sẽ phải thực hiện thêm công việc để làm cho nó hoạt động trở lại.
Mike Minicki

2

Apache CollectionUtils 4 có một phương thức CollectionUtils.emptyIfNull () trả về một danh sách trống nếu bộ sưu tập là rỗng. Điều này rất hữu ích trong vòng lặp foreach, vì vậy bạn không cần phải kiểm tra null trước khi lặp lại


1

Giải pháp của tôi là: MoreObjects.firstNonNull (danh sách, Bộ sưu tập. BlankList ())

Tôi đang sử dụng Guava MoreObjects với 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
Đây chính xác là những gì được đề xuất trong câu trả lời hàng đầu , ngoại trừ bạn không sử dụng dấu ImmutableList.
dimo414

Tôi nghĩ tiêu cực vì ai muốn giải pháp đơn giản và nhanh chóng như apache phương pháp commons inNotEmpty ...
Để Kra

Trung tâm trợ giúp> Đặc quyền> Bỏ phiếu Khi nào tôi nên bỏ phiếu? Sử dụng phiếu phản đối của bạn bất cứ khi nào bạn gặp một bài đăng cẩu thả, không tốn nhiều công sức hoặc một câu trả lời rõ ràng và có thể không chính xác một cách nguy hiểm. Bạn có một số lượng phiếu bầu hạn chế mỗi ngày, và câu trả lời có số phiếu bầu thấp khiến bạn mất một chút danh tiếng trên đó; sử dụng chúng một cách khôn ngoan. stackoverflow.com/help/privileges/vote-down
jeton

Bạn có nghĩ câu trả lời của tôi là "bài đăng cẩu thả, không tốn công sức hay câu trả lời rõ ràng và có lẽ không chính xác một cách nguy hiểm"? Nếu không, tại sao bạn lại bỏ phiếu tiêu cực?
jeton

0

Nhìn vào Appache Collections CollectionUtils.isEmpty () trả về true nếu bộ sưu tập là null hoặc rỗng

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.