Trong một ngôn ngữ lập trình với các chức năng hạng nhất, bạn muốn vượt qua xung quanh một chức năng như một tham số chỉ ra những gì bạn muốn làm bên trong vòng lặp (cho một ví dụ xem cập nhật, bên dưới). Java sẽ có lambdas trong phiên bản 8, nhưng chúng không hoàn toàn phù hợp với công việc.
Trong trạng thái hiện tại của Java, bạn sẽ phải giải quyết với thứ gì đó xấu xí hơn - ví dụ, chuyển một tham số bổ sung cho phương thức; hoặc bạn có thể vượt qua xung quanh lớp bên trong vô danh mà thực hiện một giao diện, nhưng IMHO mà thậm chí còn xấu hơn những gì tôi sắp đề nghị:
static void printSomething(List<String> list, boolean print)
Nếu print
là true
sau đó in bên trong vòng lặp, nếu không thêm vào Map
. Tất nhiên, bạn sẽ phải thêm một vài số if
trong vòng lặp để kiểm tra điều kiện này và ngay từ đầu, thêm một số if
để xác định xem Map
có được khởi chạy hay không. Dù bằng cách nào, phương thức trả về một số Map
, nhưng Map
có thể là null
cho trường hợp in. Đây là những gì tôi muốn nói:
static Map<String, String> processSomething(List<String> list, boolean print) {
Map<String, String> map = null;
if (!print)
map = new HashMap<String, String>();
for (String item : list) {
if (item.contains("aaa")) {
if (print)
System.out.println("aaa" + item);
else
map.put("aaa", item);
}
if (item.contains("bbb")) {
if (print)
System.out.println("bbb" + item);
else
map.put("bbb", item);
} else if (print) {
System.out.println(item);
}
}
return map;
}
CẬP NHẬT
Ví dụ, trong Python - cho phép các chức năng thông qua các tham số, đây là cách bạn muốn giải quyết vấn đề trong một thời trang thanh lịch:
def processSomething(lst, func):
result = None
for item in lst:
if 'aaa' in item:
result = func(item, 'aaa', result)
elif 'bbb' in item:
result = func(item, 'bbb', result)
else:
result = func(item, '', result)
return result
def printer(item, key, result):
print key + item
def mapper(item, key, result):
if not result:
result = {}
if key:
result[key] = item
return result
Xem cách hoạt động:
processSomething(['aaa', 'bbb', 'ccc'], printer)
=> aaaaaa
bbbbbb
ccc
processSomething(['aaa', 'bbb', 'ccc'], mapper)
=> {'aaa': 'aaa', 'bbb': 'bbb'}
Nó phụ thuộc ... tại sao bạn có những 2 phương pháp ... bạn có thể chia sẻ các phương thức gọi – Frank
Bạn có thể sử dụng giá trị trả về của 'getSomething()' để thực hiện các bản in trong 'printSomething()'; Tôi sẽ đi theo cách này để tránh các phương thức không trả lại (không phải là setters ofc). – adrianp
@HighPerformanceMark xin lỗi vì nhầm lẫn. Ý tôi là sao chép – hudi