2012-03-19 34 views
6

Có cách nào tốt hơn để thực hiện việc này không? Lưu ý: part1, part2part3 là các biến chuỗi được xác định ở nơi khác (chúng có thể là rỗng).Nối chuỗi Groovy với các kiểm tra rỗng

def list = [part1, part2, part3] 
list.removeAll([null]) 
def ans = list.join() 

Kết quả mong muốn là một chuỗi được nối với giá trị rỗng còn lại.

+0

Bạn có thể đóng gói tất cả trong một dòng:. 'Def ans = [part1, part2, part3] .removeAll ([null]) tham gia() ', nhưng Tôi không chắc đó là những gì bạn muốn nói "tốt hơn". – cdeszaq

+0

@cdeszaq Điều đó có thể tốt hơn, nhưng nó không hoạt động. Phương thức removeAll() trả về một Boolean và join() không thể được gọi trên Boolean. – Ryan

Trả lời

9

Bạn có thể làm điều này:

def ans = [part1, part2, part3].findAll({it != null}).join() 

Bạn thể có thể co lại việc đóng cửa xuống chỉ còn {it} tùy thuộc vào cách mục danh sách của bạn sẽ đánh giá theo Groovy Truth, nhưng điều này nên làm cho nó một chút chặt chẽ hơn .

Lưu ý: GDK javadocs là tài khoản tuyệt vời.

4

Nếu bạn sử dụng findAll không có tham số. Nó sẽ trở lại mỗi giá trị "trung thực", vì vậy đây sẽ làm việc:

def ans = [part1, part2, part3].findAll().join() 

ý rằng findAll sẽ lọc ra chuỗi rỗng (vì họ được đánh giá là sai trong một bối cảnh boolean), nhưng điều đó không quan trọng trong việc này trường hợp, vì các chuỗi trống không thêm bất kỳ thứ gì vào join() :)

Nếu đây là câu hỏi đơn giản và bạn muốn giữ giá trị chuỗi trống, bạn có thể sử dụng findResults{ it }.

+0

Điều này về cơ bản giống như câu trả lời của tôi với việc bổ sung xác nhận cách 'findAll' hoạt động, đúng không? – cdeszaq

+0

Nó cũng loại bỏ các đóng cửa được thông qua để 'findAll' và đề cập đến' findResults', mà có thể hữu ích cho các trường hợp khác. – epidemian

+0

Điểm tốt. 'findResults' có khả năng biến đổi mọi thứ tốt đẹp khi nó lọc. +1 – cdeszaq

2

Ngoài ra, bạn có thể làm điều này như một hoạt động lần với inject:

def ans = [part1, part2, part3].inject('') { result, element -> 
    result + (element ?: '') 
} 

này lặp the whole list và concatenates mỗi phần tử liên tiếp đến kết quả là, với logic để sử dụng chuỗi rỗng cho các yếu tố null.

+1

+1 Inject là một cách mạnh mẽ hơn nhiều so với câu trả lời của tôi. Nó _might_ là một chút phức tạp hơn và khó hiểu hơn mặc dù. – cdeszaq

1

Bạn có thể sử dụng grep:

groovy:000> list = ['a', 'b', null, 'c'] 
===> [a, b, null, c] 
groovy:000> list.grep {it != null}.join() 
===> abc 
+1

Bạn cũng có thể sử dụng '.grep()' vì nó mặc định sử dụng Groovy Truth như bộ lọc của nó, nhưng điều này cũng giống như sử dụng 'findAll()'. – cdeszaq

Các vấn đề liên quan