2013-02-21 38 views
5

Tôi yêu Groovy và cố gắng sử dụng nó ngày càng nhiều. Bây giờ tôi phải làm việc với thư viện Oracle Forms Jdapi. Khi làm việc với thư viện này, bạn viết rất nhiều mã như thế này:Tạo một thư viện Java "Groovy"

JdapiIterator progIterator = getWorkForm().getProgramUnits(); 
while(progIterator.hasNext()) { 
    ProgramUnit currProgUnit = (ProgramUnit) progIterator.next(); 
    ... 
} 

và của cource Tôi muốn viết

getWorkForm().programUnits.each { 
    ... 
} 

Tuy nhiên, tôi không bao giờ viết một giao diện Groovy đến một thư viện Java hiện và cần một số trợ giúp. Tôi biết về Groovy 2.0's extension methods, nhưng trong trường hợp đó tôi đang suy nghĩ về một lớp học có cùng tên trong một không gian tên khác nhau mà chỉ đại diện cho các chức năng tôi muốn giữ.

Cách tiếp cận tốt nhất để cung cấp chức năng each, nhưng tất cả các bao đóng khác có thể áp dụng cho bộ sưu tập là gì? Tôi sẽ đánh giá cao nếu bạn chỉ cho tôi đi đúng hướng!

+7

Bạn không thể viết 'getWorkForm(). ProgramUnits.each {ProgramUnit currProgUnit -> ...}' rồi? lỗi gì bạn nhận được? –

+3

Vâng, tôi luôn làm điều này. Đoạn mã trên sẽ hoạt động như mong đợi. Không cần phải viết một trình bao bọc giao diện trừ khi bạn muốn thêm một số phương thức trợ giúp. –

+0

Cảm ơn rất nhiều, hãy xem nhận xét về câu trả lời được chấp nhận. – ChrLipp

Trả lời

6

Phương pháp duy nhất bạn cần cung cấp là phương thức iterator(). Sau đó, bạn nhận được tất cả các phương thức lặp của đối tượng Groovy (each(), find(), any(), every(), collect(), ...) miễn phí!

+0

Tôi nghĩ rằng bạn có thể 'mỗi' trên một iterator quá, tức là:' 0.with {x -> ([hasNext: {x <10}, tiếp theo: {x ++}] như Iterator) .each {println it}} ' –

+0

Tôi không biết tính năng này. Sau khi đào sâu vào, tôi đã tìm thấy việc thực hiện (ít nhất là trong dokovyKK của Groovy JDK) trong java.lang.Class. Tôi nghĩ tôi phải thực hiện nhiều hơn nữa! – ChrLipp