Trước khi nói bất cứ điều gì về về các biểu thức lambda hoặc giao diện chức năng, chúng ta phải nói về sai lầm thực sự có vấn đề của bạn: bạn đang gọi sốrun()
trên một chuỗi! Nếu bạn muốn bắt đầu một chủ đề mới, bạn phải gọi start()
trên cá thể Thread
, nếu bạn muốn chạy mã tuần tự, không tạo ra một Thread
(nhưng chỉ một Runnable
).
Điều đó nói rằng, có một số phương pháp default
trên các giao diện chức năng của Java 8 để kết hợp các hàm, ví dụ: bạn có thể chuỗi hai số Function
s qua số Function.andThen(…)
nhưng các kết hợp có sẵn sẽ không được hoàn thành.
Nếu một nhiệm vụ kết hợp nào đó lặp đi lặp lại trong ứng dụng của bạn, bạn có thể xem xét việc tạo phương pháp hữu ích:
public static <T> Runnable bind(T value, Consumer<T> c) {
return()->c.accept(value);
}
public static <T,U> Consumer<U> compose(Function<U,T> f, Consumer<? super T> c) {
return u->c.accept(f.apply(u));
}
new Thread(bind("Hello 1", compose(upper, d))).start();
new Thread(bind("Hello 2", compose(lower, d))).start();
Nhưng ba phần này trông giống như một nhiệm vụ cho các API dòng:
Stream.of("Hello 1").map(upper).forEach(d);
Stream.of("Hello 2").map(lower).forEach(d);
Tôi đã tạo chuỗi mới ở đây vì không có bất kỳ lợi ích nào.
Nếu bạn thực sự muốn xử lý song song, bạn có thể làm điều đó trên một cơ sở cho mỗi nhân vật:
"Hello 1".chars().parallel()
.map(Character::toUpperCase).forEachOrdered(c->System.out.print((char)c));
nhưng vẫn sẽ không có bất kỳ lợi ích cho sự đơn giản của các nhiệm vụ và các chi phí cố định của tiến trình song song.
Các lambdas này là tất cả các ứng cử viên lý tưởng để sử dụng _method references_ thay thế: System.out :: println, String :: toUpperCase. –