2015-06-09 15 views
8

Tự hỏi nếu có cách nào tôi có thể sử dụng sql.eachRow như máy phát điện, sử dụng nó trong bối cảnh DSL nơi Bộ sưu tập hoặc Iterator được mong đợi. Trường hợp sử dụng mà tôi đang cố gắng thực hiện là tạo luồng JSON - những gì tôi đang cố gắng thực hiện là:Giải pháp cho việc thiếu từ khóa máy phát/sản lượng trong Groovy

def generator = { sql.eachRow { yield it } } 
jsonBuilder.root { 
    status "OK" 
    rows generator() 
} 

Trả lời

2

Bạn sẽ cần hỗ trợ tiếp tục (hoặc tương tự) để làm việc này. Groovy không có sự tiếp tục, JVM cũng không có. Thông thường, các kiểu truyền đi tiếp tục hoạt động, nhưng sau đó phương thức eachRow sẽ phải hỗ trợ điều đó, tất nhiên nó không có. Vì vậy, cách duy nhất tôi nhìn thấy là một giải pháp tạm thời bằng cách sử dụng các chủ đề hoặc một cái gì đó như thế. Vì vậy, có thể một cái gì đó như thế sẽ phù hợp với bạn:

def sync = new java.util.concurrent.SynchronousQueue() 
Thread.start { sql.eachRow { sync.put(it) } } 
jsonBuilder.root { 
    status "OK" 
    rows sync.take() 
} 

Tôi không nói, đây là một giải pháp tốt, chỉ là một nhà sản xuất tiêu dùng ngẫu nhiên-xung quanh cho vấn đề của bạn.

+0

Tuy nhiên, JVN có JRuby và JPython - vì vậy nó có thể được thực hiện. Cả hai ngôn ngữ đều có 'yield'. – will

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