Tôi đang cố gắng lọc tài nguyên và loại trừ một số thành phần dựa trên một trường. Để loại trừ tôi có một bộ (có chứa id cần loại trừ) và một danh sách (nó chứa nhiều phạm vi id cần loại trừ). Tôi đã viết logic dưới đây và tôi không hài lòng với logic bộ lọc thứ 2. Có cách nào tốt hơn chúng ta có thể làm với Java 8 không? Tôi cần phải làm tương tự để bao gồm cả phạm vi.
Set<String> extensionsToExclude = new HashSet<>(Arrays.asList("20","25","60","900"));
List<String> rangesToExclude = new ArrayList<>(Arrays.asList("1-10","20-25","50-70","1000-1000000"));
return directoryRecords.stream()
.filter((directoryRecord) -> !extensionsToExclude.contains(directoryRecord.getExtensionNumber()))
.filter((directoryRecord -> {
Boolean include = true;
for(String s : rangesToExclude) {
String [] rangeArray = s.split("-");
Integer extension = Integer.parseInt(directoryRecord.getExtensionNumber());
if(extension <= Integer.parseInt(rangeArray[0]) && extension >= Integer.parseInt(rangeArray[1])) {
include = false;
}
}
return include;
}))
.collect(Collectors.toList());
Cảm ơn :)
Boolean
các đối tượng khi bạn chỉ cần mộtboolean
giá trị. Mặc dù ở đây, biếninclude
là hoàn toàn lỗi thời. Khi thay đổi duy nhất có thể là từtrue
đếnfalse
, bạn có thể thay thếinclude = false;
bằngreturn false;
kết quả cuối cùng đã được xác định. Sau đó,return include;
ở cuối có thể được thay thếreturn true;
và khai báo biến bị loại bỏ. Và vìdirectoryRecord
không bao giờ thay đổi trong vòng lặp, bạn có thể di chuyểnInteger extension = Integer.parseInt(directoryRecord.getExtensionNumber());
trước vòng lặp (và thay đổiInteger
thànhint
).