Phương pháp xâu chuỗi trong các ngôn ngữ hướng đối tượng là một chút khác biệt với cà ri. Theo định nghĩa , kết quả của cà ri là một hình thức hạn chế hơn của chức năng ban đầu . Theo quy ước , kết quả của chuỗi phương thức là một dạng sửa đổi của đối tượng ban đầu (thường không phải là hàm) . Phương thức xâu chuỗi phương thức có thể được sử dụng với các phương thức không liên quan trên cùng một lớp, trong khi việc xáo trộn liên quan đến việc trả về một hàm trong đó một hoặc nhiều tham số của hàm ban đầu được cố định (được xác định trước).
Trong Java, chuỗi phương thức giống như:
String myString = new StringBuilder("Hi ").append(firstName)
.append(" ")
.append(lastName)
.append("!")
.toString();
Vì vậy, mỗi lệnh gọi phương thức .append () trả về một con trỏ tới đối tượng StringBuilder ẩn danh. Đối tượng này hoàn thành sau mỗi .append () và nó không phải là một hàm.
Ngược lại, trong Scala, ứng dụng một phần hoặc cà ri giống như:
def simple(x:Int, y:Int, z:Int) = x * (y + z)
val simpler = simple(2, _:Int, _:Int)
simpler(3, 4) => 14
(Mẫu lấy từ blog của Daniel Yankowsky )
simpler()
trong ví dụ này là một hàm bao bọc cho simple()
. simpler()
vẫn là một hàm lấy nhiều tham số hơn trước khi có thể đánh giá bất cứ thứ gì ngoại trừ phiên bản giới hạn hơn của chính nó.
EDIT: Đọc cái này một ngày sau, tôi nghĩ "hàm bao bọc" là chìa khóa. Ứng dụng Currying hoặc một phần tốt nhất có thể được mô phỏng trong Java bằng các phương thức trình bao bọc.
public interface Simpler {
public int apply(int y, int z);
}
public class Simple {
public int apply(int x, int y, int z) { return x * (y + z); }
public Simpler partiallyApply(final int x) {
final simple = this;
return new Simpler() {
@Override
public int apply(int y, int z) {
// x is the final int parameter to partiallyApply()
simple.apply(x, y, z);
}
}
}
}
: KẾT THÚC
Phương thức xâu chuỗi có thể tương tự như ứng dụng một phần hoặc currying, nhưng nó chỉ có thể tương đương với các phương thức trả về các phương thức khác (tra cứu Functor), và sau đó các phương thức cần được thiết lập với các kiểu trả về có ý nghĩa mô hình hóa currying hoặc ứng dụng một phần.
Phương thức xâu chuỗi thường được sử dụng để thực hiện một cái gì đó như đánh giá lười biếng, như được thực hiện với mẫu thiết kế "Builder" và các giao diện Thư viện bộ sưu tập mới trong Java 8 .
Tôi hy vọng điều đó sẽ giúp.