Khi tìm kiếm giải pháp cho Supplier
vấn đề tham số hóa , tôi thấy các câu trả lời trên hữu ích và áp dụng các đề xuất:
private static <T, R> Supplier<String> failedMessageSupplier(Function<String,String> fn, String msgPrefix, String ... customMessages) {
final String msgString = new StringBuilder(msgPrefix).append(" - ").append(String.join("\n", customMessages)).toString();
return () -> fn.apply(msgString);
}
Nó được gọi như thế này:
failedMessageSupplier(String::new, msgPrefix, customMsg);
Vẫn chưa hoàn toàn hài lòng với tham số hàm tĩnh dồi dào, tôi đã tìm hiểu thêm và với Function.identity () , tôi đã đi đến kết quả sau:
private final static Supplier<String> failedMessageSupplier(final String msgPrefix, final String ... customMessages) {
final String msgString = new StringBuilder(msgPrefix).append(" - ").append(String.join("\n", customMessages)).toString();
return () -> (String)Function.identity().apply(msgString);
};
Lời mời bây giờ không có tham số hàm tĩnh:
failedMessageSupplier(msgPrefix, customMsg)
Kể từ khi Function.identity()
trở lại một chức năng của các loại Object
, và do đó, các cuộc gọi tiếp theo của apply(msgString)
, một dàn diễn viên để String
được yêu cầu - hoặc bất cứ loại, áp dụng () đang được nuôi dưỡng bằng.
Phương thức này cho phép ví dụ như sử dụng nhiều tham số, xử lý chuỗi động, tiền tố hằng số chuỗi, hậu tố, v.v.
Việc sử dụng danh tính về mặt lý thuyết cũng có một chút lợi thế so với String :: new, điều này sẽ luôn tạo ra một chuỗi mới.
Như Jacob Zimmerman đã chỉ ra, dạng tham số đơn giản hơn
Supplier<Foo> makeFooFromString(String str1, String str2) {
return () -> new Foo(str1, str2);
}
luôn luôn có thể. Điều này có ý nghĩa trong bối cảnh hay không là tùy thuộc.
Như đã mô tả ở trên, các lệnh gọi tham chiếu Phương thức tĩnh yêu cầu số lượng và kiểu trả về / tham số của phương thức tương ứng để khớp với những tham số mà phương thức sử dụng hàm (luồng) mong đợi.