Cách thực hành tốt nhất để xác thực bộ sưu tập rỗng và rỗng trong Java


209

Tôi muốn xác minh xem một bộ sưu tập có trống không và null. Bất cứ ai có thể xin vui lòng cho tôi biết thực hành tốt nhất.

Hiện tại, tôi đang kiểm tra như sau:

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

10
Ngoài bất cứ điều gì khác, hãy nghĩ về lý do tại sao bạn sử dụng null == sampleMaphơn là sampleMap == null. Hầu hết mọi người tìm thấy cái sau dễ đọc hơn - cái trước là sự nắm giữ từ các ngôn ngữ khác.
Jon Skeet

6
Nhân tiện, bộ sưu tập null là xấu. Nếu có thể, làm cho nó bộ sưu tập trống thay thế. See Effective Java: Item 43 - Return empty arrays or collections, not nulls.
声 远 Shengyuan Lu

@JonSkeet mọi người sử dụng null == sampleMap trong trường hợp họ viết = thay vì ==. nếu bạn sử dụng sampleMap == null, khi bạn quên one =, nó sẽ trở thành sampleMap = null, điều này sẽ không gây ra lỗi do đó viết theo cách khác giúp nhà phát triển nhìn thấy nó
Uri Loya

1
@UriLoya: Nếu bạn viết if (null = sampleMap)bằng Java, bạn sẽ gặp lỗi biên dịch. Đó chính xác là điểm nhận xét đầu tiên của tôi. "Lý do" cho nó là ngôn ngữ cụ thể, nhưng đã được truyền bá sang các ngôn ngữ khác mặc dù hình phạt dễ đọc vì mọi người chưa xem xét lý do tại sao họ làm điều đó.
Jon Skeet

Bạn có thể sử dụng lớp CollectionUtils có trong gói org.apache.commons.collections4.CollectionUtils. Có nhiều phương thức tiện ích để tìm rỗng hoặc null.
vikash

Câu trả lời:


312

Nếu bạn sử dụng thư viện Bộ sưu tập Apache Commons trong dự án của mình, bạn có thể sử dụng CollectionUtils.isEmptyMapUtils.isEmpty()các phương thức tương ứng kiểm tra xem một bộ sưu tập hoặc bản đồ có trống hay không (nghĩa là chúng "không an toàn").

Mã đằng sau các phương thức này ít nhiều là những gì người dùng @icza đã viết trong câu trả lời của mình.

Bất kể bạn làm gì, hãy nhớ rằng bạn viết càng ít mã, bạn càng cần ít mã để kiểm tra vì độ phức tạp của mã của bạn giảm.


1
Cảm ơn MapUtils.isEmpty là giải pháp hoàn hảo để kiểm tra bản đồ là null hoặc trống
Narayan Yerrabachu

23
Thật đáng tiếc họ không được đặt tên isNullOrEmpty.
Scadge

72

Đó là cách tốt nhất để kiểm tra nó. Bạn có thể viết một phương thức trợ giúp để làm điều đó:

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

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

Phải có một chức năng tương tự Map<?>là tốt.
Luiggi Mendoza

1
Chắc chắn, bạn cũng có thể thêm một cho bản đồ, nhưng tiêu đề đã nêu bộ sưu tập.
icza

1
Tôi không hiểu nếu m là null thì .isEmpty () sẽ gây ra lỗi NullPulumException? mặt khác, nếu phía bên trái (m == null) là đúng thì phần còn lại sẽ không được kiểm tra
Ismail Sahin

4
@ismail ||Toán tử là toán tử ngắn mạch, nghĩa là nếu toán hạng bên trái là true, nó sẽ không đánh giá toán hạng bên phải. Vì vậy, nếu m == null, sau đó m.isEmpty()sẽ không được gọi (không cần thiết, kết quả là true).
icza

giải pháp hoàn hảo @icza
gaurav

32

Nếu bạn sử dụng các khung công tác Spring, thì bạn có thể sử dụng CollectionUtilsđể kiểm tra cả Bộ sưu tập (Danh sách, Mảng) và Bản đồ, v.v.

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

có thể, bạn nói về MapUtils.isEmpty () cho Map, nhưng không phải cho tất cả Bộ sưu tập?
Pavlo Chechehov

21

Cá nhân, tôi thích sử dụng các bộ sưu tập trống thay vì nullvà các thuật toán hoạt động theo cách mà thuật toán không thành vấn đề nếu bộ sưu tập có trống hay không.


10

Khi bạn sử dụng mùa xuân thì bạn có thể sử dụng

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

trong đó obj là bất kỳ [bản đồ, bộ sưu tập, mảng, aything ...]

mặt khác: mã là:

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;
}

cho chuỗi tốt nhất là:

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

3

Nếu bạn cần kiểm tra null, đó là cách. Tuy nhiên, nếu bạn có quyền kiểm soát này, chỉ cần trả lại bộ sưu tập trống, bất cứ khi nào bạn có thể và chỉ kiểm tra để trống sau này.

Chủ đề này là về điều tương tự với C #, nhưng các nguyên tắc áp dụng tốt như nhau cho java. Giống như đã đề cập ở đó, null chỉ được trả về nếu

  • null có thể có nghĩa là một cái gì đó cụ thể hơn;
  • API (hợp đồng) của bạn có thể buộc bạn trả về null.

3

Bạn có thể sử dụng org.apache.commons.lang.Validate' 's notEmpty phương pháp':

Validate.notEmpty(myCollection)-> Xác thực rằng bộ sưu tập đối số đã chỉ định không phải là null cũng không phải là kích thước bằng 0 (không có phần tử); mặt khác ném một ngoại lệ


1

Chúng tôi sẽ kiểm tra một đối tượng Collection có trống, null hay không. tất cả các phương thức được đưa ra dưới đây, đều có trong gói org.apache.commons.collections4.CollectionUtils.

Kiểm tra trên Danh sách hoặc đặt loại đối tượng bộ sưu tập.

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

Kiểm tra loại Bản đồ của Đối tượng.

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

Kiểu trả về của tất cả các phương thức là boolean.


-1

Đối với tất cả các bộ sưu tập bao gồm sử dụng bản đồ: isEmptyphương thức có trên các đối tượng bộ sưu tập này. Nhưng bạn phải kiểm tra null trước:

Map<String, String> map;

........
if(map!=null && !map.isEmpty())
......
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.