如何使用stream()java 8正确聚合并设置可分页

如何使用stream()java 8正确聚合并设置可分页,java,spring-mvc,java-8,java-stream,Java,Spring Mvc,Java 8,Java Stream,我正在开发一个Rest应用程序,需要从数据库返回数据,但排序如下: *页面 *版本 *每家公司合计 以下是我的数据: id date company code page version 4 1,49E+12 TOTO 1 FR RFQ DISTRIBUTOR 8 1,49E+12 TOTO 1 FR RFQ DISTRIBUTOR 12 1,49E+12 TOTO 1 FR RFQ DISTRIBUTOR 32 1,49E+12

我正在开发一个Rest应用程序,需要从数据库返回数据,但排序如下: *页面 *版本 *每家公司合计

以下是我的数据:

id  date    company code    page  version

4   1,49E+12    TOTO 1  FR  RFQ DISTRIBUTOR
8   1,49E+12    TOTO 1  FR  RFQ DISTRIBUTOR
12  1,49E+12    TOTO 1  FR  RFQ DISTRIBUTOR
32  1,49E+12    TOTO 2  FR  RFQ DISTRIBUTOR
56  1,49E+12    TOTO 2  FR  RFQ DISTRIBUTOR
57  1,49E+12    TOTO 2  FR  RFQ DISTRIBUTOR
78  1,49E+12    TOTO 2  FR  RFQ DISTRIBUTOR
84  1,49E+12    TOTO 3  FR  RFQ DISTRIBUTOR
87  1,49E+12    TOTO 3  FR  RFQ DISTRIBUTOR
151 1,49E+12    TOTO 4  DE  RFQ DISTRIBUTOR
155 1,49E+12    TOTO 4  DE  RFQ DISTRIBUTOR
159 1,49E+12    TOTO 4  DE  RFQ DISTRIBUTOR
169 1,49E+12    TOTO 5  DE  RFQ DISTRIBUTOR
我需要返回以下信息:

id  date    company code    page  version

4   1,49E+12    TOTO 1  FR  RFQ DISTRIBUTOR
32  1,49E+12    TOTO 2  FR  RFQ DISTRIBUTOR
84  1,49E+12    TOTO 3  FR  RFQ DISTRIBUTOR
151 1,49E+12    TOTO 4  DE  RFQ DISTRIBUTOR
169 1,49E+12    TOTO 5  DE  RFQ DISTRIBUTOR
这是我的密码:

@Override
public ServiceOut list(final Pageable pageable) {
    logger.debug("pageable: {} ", pageable);

    String page = "RFQ";

    final List<Statistics> stats = super.statisticsRepository.findAll();
    List<Statistics> resultStream = new ArrayList<>(stats);

    Map<String, List<Statistics>> list = stats.stream()
            .filter(e -> e.getPageVisited().equals(page))
            .collect(
                    Collectors.groupingBy(Statistics::getCompanyName, Collectors.toList()));

    int start = pageable.getOffset();
    int end = (start + pageable.getPageSize()) > resultStream.size() ? resultStream.size() : (start + pageable.getPageSize());

    Page<Statistics> pages = new PageImpl<Statistics>(resultStream.subList(start, end), pageable, resultStream.size());

    final List<StatisticsOut> statisticsOuts = new ArrayList<>(resultStream.size());

    final StatisticsOut statisticsOut = new StatisticsOut();
    statisticsOut.setContent(pages.getContent());
    statisticsOut.setNumber(pages.getNumber());
    statisticsOut.setNumberOfElements(pages.getNumberOfElements());
    statisticsOut.setTotalElements(pages.getTotalElements());
    statisticsOut.setTotalPages(pages.getTotalPages());
    statisticsOut.setSize(pages.getSize());
    statisticsOut.setSort(pages.getSort());
    statisticsOut.setNextPageable(pages.nextPageable());

    statisticsOuts.add(statisticsOut);

    final ServiceOut out = new ServiceOut(ServiceOut.Status.SUCCESS);
    out.setStatistics(statisticsOuts);

    return out;
}
@覆盖
公共服务输出列表(最终可分页){
debug(“pageable:{}”,pageable);
String page=“RFQ”;
final List stats=super.statisticsRepository.findAll();
List resultStream=新的ArrayList(stats);
Map list=stats.stream()
.filter(e->e.getPageVisited().equals(第页))
.收集(
Collectors.groupby(Statistics::getCompanyName,Collectors.toList());
int start=pageable.getOffset();
int end=(start+pageable.getPageSize())>resultStream.size()?resultStream.size():(start+pageable.getPageSize());
Page pages=new PageImpl(resultStream.subList(开始、结束)、可分页、resultStream.size());
最终列表统计输出=新的ArrayList(resultStream.size());
最终统计输出统计输出=新统计输出();
statisticsOut.setContent(pages.getContent());
statisticsOut.setNumber(pages.getNumber());
statisticsOut.setNumberOfElements(page.getNumberOfElements());
statisticsOut.setTotalElements(page.getTotalElements());
statisticsOut.setTotalPages(pages.getTotalPages());
statisticsOut.setSize(pages.getSize());
statisticsOut.setSort(pages.getSort());
statisticsOut.setNextPageable(page.nextPageable());
统计输出。添加(统计输出);
最终ServiceOut=新ServiceOut(ServiceOut.Status.SUCCESS);
输出。设置统计(统计输出);
返回;
}
首先:我想将我的地图转换成列表,以便正确设置“new PageImpl” 第二:看起来像是在地图>列表上执行logger.debug时,输出看起来是一致的,但我无法将数据解析到页面中


事实上我很绝望,如果有人能帮助我,我会很感激的

我做了点什么,也得到了同样的结果。我希望它能帮助你

public static void main(String[] args) {
        List<Statictics> statictics = new ArrayList<>();
        statictics.add(new Statictics(4, new Date(), "TOTO", 1, "FR", "RFQ DISTRIBUTOR"));
        statictics.add(new Statictics(8, new Date(), "TOTO", 1, "FR", "RFQ DISTRIBUTOR"));
        statictics.add(new Statictics(12, new Date(), "TOTO", 1, "FR", "RFQ DISTRIBUTOR"));
        statictics.add(new Statictics(32, new Date(), "TOTO", 2, "FR", "RFQ DISTRIBUTOR"));
        statictics.add(new Statictics(56, new Date(), "TOTO", 2, "FR", "RFQ DISTRIBUTOR"));
        statictics.add(new Statictics(57, new Date(), "TOTO", 2, "FR", "RFQ DISTRIBUTOR"));
        statictics.add(new Statictics(78, new Date(), "TOTO", 2, "FR", "RFQ DISTRIBUTOR"));
        statictics.add(new Statictics(84, new Date(), "TOTO", 3, "FR", "RFQ DISTRIBUTOR"));
        statictics.add(new Statictics(87, new Date(), "TOTO", 3, "FR", "RFQ DISTRIBUTOR"));
        statictics.add(new Statictics(151, new Date(), "TOTO", 4, "FR", "RFQ DISTRIBUTOR"));
        statictics.add(new Statictics(155, new Date(), "TOTO", 4, "FR", "RFQ DISTRIBUTOR"));
        statictics.add(new Statictics(159, new Date(), "TOTO", 4, "FR", "RFQ DISTRIBUTOR"));
        statictics.add(new Statictics(169, new Date(), "TOTO", 5, "FR", "RFQ DISTRIBUTOR"));

        statictics.stream()
                .collect(Collectors.groupingBy(Statictics::getCode))
                .entrySet().stream()
                .map(e -> e.getValue().get(0))
                .collect(Collectors.toList()).forEach(System.out::println);
    }

    private static class Statictics {
        int id;
        Date date;
        String company;
        int code;
        String page;
        String version;

        public Statictics(int id, Date date, String company, int code, String page, String version) {
            this.id = id;
            this.date = date;
            this.company = company;
            this.code = code;
            this.page = page;
            this.version = version;
        }

        @Override
        public String toString() {
            return "id : " + id + " code : " + code;
        }

        public int getCode() {
            return code;
        }
    }

这对我来说很好。也许你可以帮我优化我的代码,因为我确信我可以大大减少我用stream()和aggregate functionality编写的庞大函数:
id : 4 code : 1
id : 32 code : 2
id : 84 code : 3
id : 151 code : 4
id : 169 code : 5