2011-12-14 44 views
36

Cách groovy để xem nếu có điều gì là trong danh sách là sử dụng "trong"Groovy không trong bộ sưu tập

if('b' in ['a','b','c']) 

Tuy nhiên làm thế nào để bạn độc đáo xem có cái gì không có trong một bộ sưu tập?

if(!('g' in ['a','b','c'])) 

Có vẻ lộn xộn và "!" được ẩn với cái nhìn bình thường. Có một cách ngớ ngẩn thành ngữ hơn để làm điều này?

Cảm ơn!

Trả lời

22

Tôi nghĩ rằng không có cú pháp khá là not in. Nhưng bạn có thể sử dụng một biến helper để làm cho nó dễ đọc hơn:

def isMagicChar = ch in ['a', 'b', 'c'] 
if (!isMagicChar) ... 

Hoặc, trong trường hợp này, bạn có thể sử dụng một regex :)

if (ch !=~ /[abc]/) ... 
19

Một cách khác để viết nó là với contains, ví dụ

if (!['a', 'b', 'c'].contains('b')) 

Nó tiết kiệm thêm cấp ngoặc đơn với chi phí thay thế toán tử bằng cuộc gọi phương thức.

+3

Tuy đặt 'not' xa' contains', làm cho nó dễ dàng để bỏ lỡ trong nháy mắt:/ –

7

đọc hơn, tôi không chắc chắn:

assert ['a','b','c'].any{it == 'b'} 
assert ['a','b','c'].every{it != 'g'} 

Ví dụ của bạn:

if (['a','b','c'].every{it != 'g'}) 

Một vài tháng trước, tôi đề nghị một new operator overloading ! (not operator). Bây giờ, có lẽ bạn có thể sử dụng bất kỳ số lẻ của cảm thán;)

if(!!!('g' in ['a','b','c'])) 
+1

Tại liên kết của bạn, quản lý dự án Codehaus Groovy cho biết "Bạn luôn có thể sử dụng một số thủ thuật metaclass expando, hoặc một chuyển đổi AST, để thêm những người không phải là phương pháp". Bây giờ, nếu anh ta chỉ viết "Tôi sẽ sử dụng một số thủ thuật metaclass expando, hoặc một phép biến đổi AST, để thêm những thứ đó không phải là phương pháp trong bản phát hành tiếp theo của Codehaus Groovy". Sau đó, chúng tôi sẽ không có một vấn đề chúng tôi sẽ. –

+5

nếu (!!! ('g' trong ['a', 'b', 'c'])) - đọc là "nếu g thực sự thực sự không nằm trong danh sách này" – JesusFreke

0

Theo tài liệu Grails về việc tạo ra các tiêu chí here, bạn có thể sử dụng một cái gì đó như thế này:

not {'in'("age",[18..65])} 

Trong ví dụ này, bạn có một thuộc tính có tên là "age" và bạn muốn nhận các hàng KHÔNG nằm trong khoảng từ 18 đến 65. Tất nhiên, phần [18..65] có thể được thay thế bằng bất kỳ danh sách giá trị hoặc phạm vi nào bạn cần.

+1

Đúng, nhưng câu hỏi của tôi không cụ thể về một tiêu chí (đang xây dựng một truy vấn sql.) Tôi muốn biết liệu ngôn ngữ và thư viện groovy có hỗ trợ cái gì ngắn gọn hơn không. –

10

Bạn có thể thêm chức năng mới:

Object.metaClass.notIn = { Object collection -> 
    !(delegate in collection) 
} 


assert "2".notIn(['1', '2q', '3']) 
assert !"2".notIn(['1', '2', '3']) 

assert 2.notIn([1, 3]) 
assert !2.notIn([1, 2, 3]) 

assert 2.notIn([1: 'a', 3: 'b']) 
assert !2.notIn([1: 'a', 2: 'b']) 
Các vấn đề liên quan