boot应用中如何用流java11api过滤页面流

tktrz96b  于 2021-07-08  发布在  Java
关注(0)|答案(2)|浏览(349)

关闭。这个问题需要细节或清晰。它目前不接受答案。
**想改进这个问题吗?**通过编辑这个帖子来添加细节并澄清问题。

上个月关门了。
改进这个问题
我有以下方法和步骤data:-

public Page<MydataDTO> getData(){
    // here var data is Page<MydataDTO>
    var data = this.dataRepository.findAll(specification, pageable) 
                                        .map(MydataDTO::from);

   if(startOfDay != null && atEndOfDay != null){
        Instant finalStartOfDay = startOfDay;
        Instant finalAtEndOfDay = atEndOfDay;
   // here var filteredData is Lit<MydataDTO>       
   var filteredData = vv.stream().filter(e -> e.getCreated().isAfter(finalStartOfDay) && e.getCreated().isBefore(finalAtEndOfDay))
   .collect(Collectors.toList());

    }
}

因为我必须从这个函数返回页面。如何从这个函数获取fitter数据和返回页面?我能把列表转换成页面吗?也许是的,但出于表演的原因,我不应该这么做。因为把页面转换成列表再转换回页面听起来很疯狂。对于大量的收藏品来说,这是非常糟糕的。我怎样才能有效地做到这一点?

ukxgm1gy

ukxgm1gy1#

最好的选择是通过在您的规范中添加一个按日期过滤来获取已经过滤的数据。如果你想像你说的那样做,你必须用过滤列表创建一个新的页面。

@Autowired
private UserRepository userRepository;

@Test
public void test1() {
    Pageable pageable = PageRequest.of(0, 10,  Sort.by(Order.desc("id")));
    Page<User> page = userRepository.findAll(pageable);

    Page<User> pageWithFilteredData = new PageImpl<User>(page.stream().filter(user -> user.getName().contains("john"))
    .collect(Collectors.toList()), page.getPageable(), page.getSize());
}
wztqucjr

wztqucjr2#

假设你已经延长了 JpaSpecificationExecutor<MydataDTO> 如果没有,请延长 JpaSpecificationExecutor 尝试动态构建查询,并通过查询进行筛选,而不是先获取结果,然后再进行筛选

final Optional<Date> after = Optional.ofNullable(startOfDay);
final Optional<Date> before = Optional.ofNullable(atEndOfDay);

Specification<MydataDTO> inBetweenDates = null; 

if(before.isPresent() && after.isPresent()) {
    inBetweenDates = (root, query, cb) -> {
        return cb.between(root.get("created"), after.get(), before.get());
    };
}

dataRepository.findAll(inBetweenDates, pageable);

相关问题