Trong câu hỏi trước [How to dynamically do filtering in Java 8?] Stuart Marks đã đưa ra một câu trả lời tuyệt vời và cung cấp một số tiện ích hữu ích để xử lý lựa chọn topN và topPercent từ luồng.Làm thế nào để có được một loạt các mục từ luồng bằng cách sử dụng Java 8 lambda?
tôi sẽ bao gồm chúng ở đây từ câu trả lời ban đầu của mình:
@FunctionalInterface
public interface Criterion {
Stream<Widget> apply(Stream<Widget> s);
}
Criterion topN(Comparator<Widget> cmp, long n) {
return stream -> stream.sorted(cmp).limit(n);
}
Criterion topPercent(Comparator<Widget> cmp, double pct) {
return stream -> {
List<Widget> temp =
stream.sorted(cmp).collect(toList());
return temp.stream()
.limit((long)(temp.size() * pct));
};
}
Câu hỏi của tôi ở đây là:
[1] Làm thế nào để có được mục top 3-7 từ một dòng với số tiền nhất định của mặt hàng, vì vậy nếu dòng có mặt hàng từ A1, A2 .. A10, cuộc gọi đến
topNFromRange(Comparator<Widget> cmp, long from, long to) = topNFromRange(comparing(Widget::length), 3L, 7L)
sẽ trở lại {A3, A4, A5, A6, A7}
Cách đơn giản nhất tôi có thể nghĩ đến là nhận được từ 7 [T7] hàng đầu từ bản gốc, nhận được từ 3 [T3] hàng đầu từ bản gốc và sau đó nhận T7 - T3.
[2] Làm thế nào để có được mặt hàng đầu từ trên 10% đến 30% đầu từ một dòng với số tiền nhất định của mặt hàng, vì vậy nếu dòng có mặt hàng từ X1, X2 .. X100, cuộc gọi đến
topPercentFromRange(Comparator<Widget> cmp, double from, double to) = topNFromRange(comparing(Widget::length), 0.10, 0.30)
sẽ trở lại {X10, X11, X12, ..., X29, X30}
cách đơn giản nhất tôi có thể nghĩ đến là có được top 30% [TP30] từ gốc, có được top 10% [TP10 ] từ bản gốc, và sau đó nhận TP30 - TP10.
Một số cách tốt hơn để sử dụng Java 8 Lambda để thể hiện chính xác các tình huống trên là gì?
Đóng đủ để những gì tôi đang tìm kiếm, tôi sẽ làm việc ra các chi tiết, cảm ơn! – Frank
Tôi đã cập nhật câu trả lời của mình cũng bao gồm một hình thức của những gì bạn đang làm, nhưng sau đó với việc sử dụng Bộ sưu tập, có lẽ nó cũng có thể là thú vị cho câu hỏi ban đầu của tiêu chí? – skiwi
@skiwi Thú vị, sử dụng chức năng kết thúc của một bộ sưu tập để biến bộ sưu tập trở lại thành một luồng. Tôi không chắc liệu nó có nhất thiết tốt hơn hay tệ hơn là chỉ khai báo một biến cục bộ. (Tham số lambda được sử dụng như một địa phương trong trường hợp này.) Đó là một kỹ thuật hữu ích để ghi nhớ cho tương lai, mặc dù. –