Groovy - Đóng cửa
Đóng là một khối mã ẩn danh ngắn. Nó chỉ thường kéo dài một vài dòng mã. Một phương thức thậm chí có thể lấy khối mã làm tham số. Chúng vô danh về bản chất.
Sau đây là một ví dụ về một đóng đơn giản và nó trông như thế nào.
class Example {
static void main(String[] args) {
def clos = {println "Hello World"};
clos.call();
}
}
Trong ví dụ trên, dòng mã - {println "Hello World"} được gọi là một dòng đóng. Khối mã được tham chiếu bởi định danh này có thể được thực thi với câu lệnh gọi.
Khi chúng ta chạy chương trình trên, chúng ta sẽ nhận được kết quả sau:
Hello World
Tham số chính thức trong bao đóng
Closures cũng có thể chứa các tham số chính thức để làm cho chúng hữu ích hơn giống như các phương thức trong Groovy.
class Example {
static void main(String[] args) {
def clos = {param->println "Hello ${param}"};
clos.call("World");
}
}
Trong ví dụ mã ở trên, hãy lưu ý việc sử dụng $ {param} khiến đóng cửa nhận một tham số. Khi gọi bao đóng thông qua câu lệnh close.call, bây giờ chúng ta có tùy chọn để truyền một tham số cho bao đóng.
Khi chúng ta chạy chương trình trên, chúng ta sẽ nhận được kết quả sau:
Hello World
Hình minh họa tiếp theo lặp lại ví dụ trước đó và tạo ra kết quả tương tự, nhưng cho thấy rằng một tham số tiềm ẩn đơn lẻ được gọi là nó có thể được sử dụng. Đây là một từ khóa trong Groovy.
class Example {
static void main(String[] args) {
def clos = {println "Hello ${it}"};
clos.call("World");
}
}
Khi chúng ta chạy chương trình trên, chúng ta sẽ nhận được kết quả sau:
Hello World
Đóng cửa và các biến
Chính thức hơn, bao đóng có thể tham chiếu đến các biến tại thời điểm đóng được xác định. Sau đây là một ví dụ về cách có thể đạt được điều này.
class Example {
static void main(String[] args) {
def str1 = "Hello";
def clos = {param -> println "${str1} ${param}"}
clos.call("World");
// We are now changing the value of the String str1 which is referenced in the closure
str1 = "Welcome";
clos.call("World");
}
}
Trong ví dụ trên, ngoài việc truyền một tham số cho bao đóng, chúng ta cũng định nghĩa một biến có tên là str1. Việc đóng cũng nhận biến cùng với tham số.
Khi chúng ta chạy chương trình trên, chúng ta sẽ nhận được kết quả sau:
Hello World
Welcome World
Sử dụng các phương pháp đóng cửa
Closures cũng có thể được sử dụng làm tham số cho các phương thức. Trong Groovy, rất nhiều phương thức có sẵn cho kiểu dữ liệu như Danh sách và bộ sưu tập có các bao đóng như một kiểu tham số.
Ví dụ sau cho thấy cách một bao đóng có thể được gửi đến một phương thức dưới dạng tham số.
class Example {
def static Display(clo) {
// This time the $param parameter gets replaced by the string "Inner"
clo.call("Inner");
}
static void main(String[] args) {
def str1 = "Hello";
def clos = { param -> println "${str1} ${param}" }
clos.call("World");
// We are now changing the value of the String str1 which is referenced in the closure
str1 = "Welcome";
clos.call("World");
// Passing our closure to a method
Example.Display(clos);
}
}
Trong ví dụ trên,
Chúng tôi đang định nghĩa một phương thức tĩnh được gọi là Display, phương thức này nhận một hàm đóng làm đối số.
Sau đó, chúng tôi đang xác định một bao đóng trong phương thức chính của mình và chuyển nó tới phương thức Hiển thị của chúng tôi dưới dạng một tham số.
Khi chúng ta chạy chương trình trên, chúng ta sẽ nhận được kết quả sau:
Hello World
Welcome World
Welcome Inner
Đóng trong Bộ sưu tập và Chuỗi
Một số phương thức List, Map và String chấp nhận một bao đóng làm đối số. Hãy xem ví dụ về cách các bao đóng có thể được sử dụng trong các kiểu dữ liệu này.
Sử dụng Đóng với Danh sách
Ví dụ sau đây cho thấy cách các bao đóng có thể được sử dụng với Danh sách. Trong ví dụ sau, trước tiên chúng ta định nghĩa một danh sách các giá trị đơn giản. Sau đó, kiểu tập hợp danh sách xác định một hàm được gọi.each. Hàm này nhận bao đóng làm tham số và áp dụng bao đóng cho từng phần tử của danh sách.
class Example {
static void main(String[] args) {
def lst = [11, 12, 13, 14];
lst.each {println it}
}
}
Khi chúng ta chạy chương trình trên, chúng ta sẽ nhận được kết quả sau:
11
12
13
14
Sử dụng Closures với Bản đồ
Ví dụ sau đây cho thấy cách sử dụng các điểm đóng với Maps. Trong ví dụ sau, chúng tôi đầu tiên định nghĩa một Bản đồ đơn giản của các mục giá trị quan trọng. Sau đó, kiểu tập hợp bản đồ xác định một hàm được gọi là .each. Hàm này nhận bao đóng làm tham số và áp dụng bao đóng cho từng cặp khóa-giá trị của bản đồ.
class Example {
static void main(String[] args) {
def mp = ["TopicName" : "Maps", "TopicDescription" : "Methods in Maps"]
mp.each {println it}
mp.each {println "${it.key} maps to: ${it.value}"}
}
}
Khi chúng ta chạy chương trình trên, chúng ta sẽ nhận được kết quả sau:
TopicName = Maps
TopicDescription = Methods in Maps
TopicName maps to: Maps
TopicDescription maps to: Methods in Maps
Thông thường, chúng ta có thể muốn lặp qua các thành viên của một tập hợp và chỉ áp dụng một số logic khi phần tử đáp ứng một số tiêu chí. Điều này dễ dàng được xử lý với một câu lệnh điều kiện trong bao đóng.
class Example {
static void main(String[] args) {
def lst = [1,2,3,4];
lst.each {println it}
println("The list will only display those numbers which are divisible by 2")
lst.each{num -> if(num % 2 == 0) println num}
}
}
Ví dụ trên cho thấy biểu thức if (num% 2 == 0) có điều kiện đang được sử dụng trong bao đóng được sử dụng để kiểm tra xem mỗi mục trong danh sách có chia hết cho 2 hay không.
Khi chúng ta chạy chương trình trên, chúng ta sẽ nhận được kết quả sau:
1
2
3
4
The list will only display those numbers which are divisible by 2.
2
4
Các phương pháp sử dụng với Closures
Việc đóng cửa tự cung cấp một số phương pháp.
Sr.No. | Phương pháp & Mô tả |
---|---|
1 | tìm thấy() Phương thức find tìm giá trị đầu tiên trong tập hợp phù hợp với một số tiêu chí. |
2 | findAll () Nó tìm tất cả các giá trị trong đối tượng nhận phù hợp với điều kiện đóng. |
3 | any () & every () Phương thức bất kỳ lặp lại qua từng phần tử của tập hợp để kiểm tra xem một vị từ Boolean có hợp lệ cho ít nhất một phần tử hay không. |
4 | sưu tầm() Phương pháp thu thập lặp lại thông qua một bộ sưu tập, chuyển đổi mỗi phần tử thành một giá trị mới bằng cách sử dụng đóng làm máy biến áp. |