如何解决Java 8 Lambda表达式或旧方法
大家好,我对Java 8 lambda表达式有疑问。例如,我想从课程中删除以下ID。
UserEntity userEntity = userEntityOptional.get();
for(Long permission_id : deletePermissionDto.getPermissionId())
{
for(PrivilegeEntity p : userEntity.getPrivilegeEntities())
{
if(p.getId().equals(permission_id)){
userEntity.getPrivilegeEntities().remove(p);
break;
}
}
}
类似于此代码,可以在Java 8中使用lambda表达式实现。
userEntity.getPrivilegeEntities().removeIf(i -> deletePermissionDto.getPermissionId().stream().anyMatch(i.getId()::equals));
我很想知道与第一个代码块相同的Java 8实现的渐近性。以及您如何看待这段代码的最佳实现方式。
解决方法
您的第二个解决方案比第一个解决方案快。
- 第一个是
O(n*m^2)
(如果可以的话。如果您尝试删除除最后一个许可之外的任何权限,我怀疑应该抛出IllegalStateException
) - 第二个是
O(n*m)
其中n
的大小为deletePermissionDto.getPermissionId()
,m
的大小为userEntity.getPrivilegeEntities()
。
最佳解决方案是:
HashSet<Long> ids = new HashSet<>(deletePermissionDto.getPermissionId());
userEntity.getPrivilegeEntities()
.removeIf(x -> ids.contains(x.getId()));
得分为O(n+m)
PS:如果您对实际性能感兴趣,答案会有所不同。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。