Tất nhiên là tôi có thể sử dụng new List(Collection2.filter())
, nhưng cách này không đảm bảo rằng đơn hàng của tôi vẫn như cũ.
Điều này không đúng. Collections2.filter()
là một chức năng được đánh giá một cách lười biếng - nó không thực sự lọc bộ sưu tập của bạn cho đến khi bạn bắt đầu truy cập vào phiên bản đã lọc. Ví dụ: nếu bạn lặp lại phiên bản đã lọc, thì các phần tử được lọc sẽ bật ra khỏi trình lặp theo thứ tự như bộ sưu tập ban đầu của bạn (hiển nhiên là trừ những phần tử đã lọc ra).
Có lẽ bạn đã nghĩ rằng nó thực hiện lọc trước, sau đó chuyển kết quả vào một Bộ sưu tập tùy ý, không có thứ tự của một số dạng - nó không phải vậy.
Vì vậy, nếu bạn sử dụng đầu ra Collections2.filter()
làm đầu vào cho một danh sách mới, thì đơn đặt hàng ban đầu của bạn sẽ được giữ lại.
Sử dụng nhập tĩnh (và Lists.newArrayList
hàm), nó trở nên khá ngắn gọn:
List filteredList = newArrayList(filter(originalList, predicate));
Lưu ý rằng mặc dù Collections2.filter
sẽ không háo hức lặp lại tập hợp bên dưới, nhưng Lists.newArrayList
sẽ - nó sẽ trích xuất tất cả các phần tử của tập hợp đã lọc và sao chép chúng vào một tập hợp mới ArrayList
.