如何有效地从列表中删除
How to efficiently remove from list
我有一个使用注意事项,我需要将一组过滤器应用于字符串列表,并在有某种原因说明为什么应将其过滤掉时从列表中删除字符串。我目前是这样做的:
private List<Data> applyFilter(Request request) {
if (CollectionUtils.isNotEmpty(request.getDataList())) {
Map<String,Data> map =
request.getDataList()
.stream()
.collect(Collectors.toMap(Data::getId, data -> data));
for (Data data : request.getDataList()) {
for (final Filter<Request> filter : filters) {
if (filter.getReason(data) != null) {
map.remove(data.getId);
}
}
}
return (List<Data>) map.values();
}
return new ArrayList<>();
}
有没有比我目前的方法更有效的方法?此外,在我当前的方法中,如果字符串具有过滤原因,我仍将对其进行迭代,因为我正在对列表进行迭代。如果前一个过滤器有原因,我如何确保我不会为下一个过滤器迭代字符串。
谢谢
与Java8+
List<Data> filtered = request.getDataList().stream()
.filter(data -> filters.stream()
.noneMatch(f -> f.getReason(data) != null))
.collect(Collectors.toList());
我有一个使用注意事项,我需要将一组过滤器应用于字符串列表,并在有某种原因说明为什么应将其过滤掉时从列表中删除字符串。我目前是这样做的:
private List<Data> applyFilter(Request request) {
if (CollectionUtils.isNotEmpty(request.getDataList())) {
Map<String,Data> map =
request.getDataList()
.stream()
.collect(Collectors.toMap(Data::getId, data -> data));
for (Data data : request.getDataList()) {
for (final Filter<Request> filter : filters) {
if (filter.getReason(data) != null) {
map.remove(data.getId);
}
}
}
return (List<Data>) map.values();
}
return new ArrayList<>();
}
有没有比我目前的方法更有效的方法?此外,在我当前的方法中,如果字符串具有过滤原因,我仍将对其进行迭代,因为我正在对列表进行迭代。如果前一个过滤器有原因,我如何确保我不会为下一个过滤器迭代字符串。
谢谢
与Java8+
List<Data> filtered = request.getDataList().stream()
.filter(data -> filters.stream()
.noneMatch(f -> f.getReason(data) != null))
.collect(Collectors.toList());