2011-01-16 31 views
10

Tôi có một lớp miền chỉ là một danh sách các chuỗi (youtubeLinks).Cập nhật "nó" bên trong một đóng cửa Groovy

Khi lưu các liên kết này, tôi muốn loại bỏ ID video và lưu nó thay vì toàn bộ URL được nhập trên giao diện người dùng.

Đây là những gì tôi đang cố gắng (bỏ qua rằng regex là thiếu sót)

youtubeLinks.each { 
def youtubeRegex = /v=(.*)/ 
def matcher = (it =~ youtubeRegex) 
it = matcher[0][1] 
} 

Khi tôi tiết kiệm này, nó tiết kiệm giá trị ban đầu của "nó". Có cách nào để cập nhật tham chiếu này và có lưu nó đúng không?

Cảm ơn.

Trả lời

21

Vòng 1 của Groovy là each chỉ là một trình lặp và do đó nó không ảnh hưởng đến bộ sưu tập mà nó hoạt động và không trả về giá trị của riêng nó. Về cơ bản nó tương đương với "vòng lặp nâng cao (for-each)" của Java, chỉ với sự tiện lợi của việc gõ động và một biến vòng lặp ngầm (nó). Trong khi it có thể được sửa đổi, nó là một doanh nghiệp vô ích, vì bạn chỉ đơn giản là thay đổi một tham chiếu đến giá trị ban đầu, không phải là giá trị chính nó. Xem this question để biết thêm về điều đó.

Khi bạn cần sửa đổi mọi phần tử trong bộ sưu tập bằng cách nào đó, giải pháp Groovy (Grails) thành ngữ là sử dụng phương thức collect. Thu thập các biến đổi mỗi phần tử thông qua việc đóng mà bạn cung cấp, cuối cùng trả về một bộ sưu tập mới (vì vậy, nó không thực sự "sửa đổi" bất kỳ thứ gì).

Về cơ bản, có thể bạn sẽ muốn làm một cái gì đó như thế này:

def links = '''http://www.youtube.com/watch?v=fl6s1x9j4QQ 
http://www.youtube.com/watch?v=tCvMKcNJCAY 
''' 

assert (links =~ /watch\?v=(.*)/).collect{match -> match[1]} == ["fl6s1x9j4QQ", "tCvMKcNJCAY"] 

..Though có thực sự là một số cách người ta có thể đi về một nhiệm vụ như vậy trong Groovy.

Ngoài ra, Ted Naleid's blog có một số ví dụ hay về kết hợp mẫu Groovy mà bạn có thể thấy hữu ích.

Sửa Dưới đây là một số cách mà bạn có thể bỏ qua một số giải pháp bạn đã gửi:

youtubeLinks = youtubeLinks.collect{link -> (link =~ /\?v=(.*)$/)[0][1]} 

hoặc

youtubeLinks = youtubeLinks.collect{link -> link.replaceAll(/^.*\?v=/, "") } 

hay này (Mặc dù đó là một chút giả tạo)

youtubeLinks = youtubeLinks.join('\n').replaceAll(/.*\?v=/, '').split() 
+0

Cảm ơn! Tôi sẽ kiểm tra điều này. – user577905

+0

Tôi thích chỉnh sửa của bạn. Cảm ơn! – user577905

+0

Câu trả lời hay. Nhưng video trên liên kết thứ hai đã bị xóa = ( – epidemian

2

Bạn là ri ght, nó đã kết thúc giống như

youtubeLinks = youtubeLinks.collect { 
    def youtubeRegex = /v=(.*)[&]/ 
    def matcher = (it =~ youtubeRegex) 
    return matcher[0][1] 
} 

Xin cảm ơn, Northover.

+1

Vui vì tôi có thể giúp. Tôi đã thêm một số giải pháp làm việc bổ sung vào câu trả lời của tôi, nếu bạn quan tâm đến các cách hợp nhất mã. – Northover

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