我正在尝试过滤资源并基于字段排除一些元素。要排除,我有一个集合(其中包含一个需要排除的ID)和一个列表(其中包含多个范围的需要排除的ID)。我写了下面的逻辑,但对第二个过滤器逻辑不满意。有没有更好的方法可以用Java 8做到这一点?对于包含范围,我也需要这样做。
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());
谢谢 :)
Boolean
仅在需要boolean
值时不要使用对象。尽管在这里,变量include
完全过时了。当唯一可能的变化是从true
到false
,可以替换include = false;
与return false;
最后的结果已经被确定。然后,return include;
可以用替换末尾的,return true;
并删除变量声明。而且,由于directoryRecord
循环中永远不会发生变化,因此您可以Integer extension = Integer.parseInt(directoryRecord.getExtensionNumber());
在循环之前移动(并更改Integer
为int
)。