【发布时间】:2019-12-08 04:56:10
【问题描述】:
我正在开发一个 java spring 应用程序,想过滤并获取 mongodb 数据库中的特定项目,但我的代码非常混乱,想知道在使用流过滤器时如何改进我的代码
public String getPrimaryTechnology(String id){
Article article = articleRepository.findById(id).get();
List<AWS_entity> aws_entitiesList = article.getAws().getEntities();
Predicate<AWS_entity> priority1 = aws -> article.getTitle().contains(aws.getName())
&& aws.getCategory().equals("TITLE");
Predicate<AWS_entity> priority2 = aws -> article.getTitle().contains(aws.getName())
&& aws.getCategory().equals("COMMERCIAL_ITEM"));
Predicate<AWS_entity> priority3 = aws -> article.getTitle().contains(aws.getName())
&& (aws.getCategory().equals("ORGANIZATION") || aws.getCategory().equals("OTHER"));
Optional<AWS_entity> aws_entity = Optional.ofNullable(aws_entitiesList
.stream()
.sorted(Comparator.comparing(AWS_entity::getCount).reversed())
.filter(priority1)
.findFirst()
.orElse(aws_entitiesList.stream()
.filter(priority2)
.findFirst()
.orElse(aws_entitiesList.stream()
.filter(priority3)
.findFirst().orElse(null)
)
))
;
if(!aws_entity.isPresent())
return "none identified";
else return aws_entity.get().getName();
}
【问题讨论】:
-
你的 Java 版本是多少?
-
@ernest_k 我有 java openjdk11
-
@Mhanxsolo 如果您想提高速度,我建议从答案中改进流解决方案。代替 sort->filter->findfirst 使用 filter->max(或 min),而不是 filter->findfirst 使用 findAny。
-
循环并没有那么快,除了它们操作的是原始类型的数组,而不是对象。您可以找到一些循环与流的比较。
-
请注意:当您使用
.orElse时,它的参数将总是被评估,无论它是否实际需要。考虑到您正在经历(可能)大型收藏,这可能非常昂贵(阅读:慢)。在这种情况下使用.orElseGet:只有在需要时才会执行昂贵的操作。.orElse应保留用于返回常量的情况(即Collection.emptyList、""、0)。
标签: java filter java-stream