Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/371.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 以反应式方式使用分页API_Java_Pagination_Reactive Programming_Project Reactor - Fatal编程技术网

Java 以反应式方式使用分页API

Java 以反应式方式使用分页API,java,pagination,reactive-programming,project-reactor,Java,Pagination,Reactive Programming,Project Reactor,我试图弄清楚如何以反应式的方式使用分页API,公开项目流,而不是API提供给我的页面 我拥有的-分页API Slack API(和许多其他API)使用某种形式的元数据对象处理分页,因此在查询/API/stuff时,您会得到如下对象: { "items": [ <list of first page you requested> ], "meta": { "cursor": "<a cursor string to get the next pag

我试图弄清楚如何以反应式的方式使用分页API,公开项目流,而不是API提供给我的页面

我拥有的-分页API Slack API(和许多其他API)使用某种形式的元数据对象处理分页,因此在查询
/API/stuff
时,您会得到如下对象:

{
    "items": [ <list of first page you requested> ],
    "meta": {
        "cursor": "<a cursor string to get the next page>"
    }
}
{
“项目”:[…],
“元”:{
“光标”:”
}
}
然后,您可以使用
GET/api/stuff?cursor=
请求下一个页面,在响应中,您将获得一个新的光标,因此您可以继续进行,直到您得到一个光标为空的响应-这是最后一个可用页面

我想要的-一系列的物品 对于Reactor,我想提供一种返回类型为
Flux
的方法,即消费者不需要知道或关心每次实际获取一页内容的所有项目流

基本上,我想做一些事情,采用一个初始状态和一个签名为
state->Mono
(或等效)的方法,通过顺序获取新页面,给我一个
流量,直到
状态
表明我们完成了

我曾尝试使用
Flux.create
Flux.generate
来表达一些东西,但它们的用例似乎与我的略有不同


我怎么去那里?我是一个反应堆新手,但我认为这就是为什么:

这里是一个完整的演示,其中
getFirstPage()
getNextPage()
模拟SlackAPI
getNextPage()
返回光标到达值5时的最后一页

public class Slack {
    public static void main(String[] args) {
        getFirstPage().expand(page -> getNextPage(page))
                      .flatMapIterable(page -> page.getResult())
                      .subscribe(System.out::println);
    }

    private static Mono<Page> getFirstPage() {
        System.out.println("getting first page");
        return Mono.just(new Page(Arrays.asList("page0-1", "page0-2"), 1));
    }

    private static Mono<Page> getNextPage(Page page) {
        System.out.println("getting page " + page.getCursor());
        if (page.getCursor() == null) {
            return Mono.empty();
        }
        Integer nextCursor = (page.getCursor() == 5) ? null : page.getCursor() + 1;
        return Mono.just(new Page(Arrays.asList("page" + page.getCursor() + "-1", "page" + page.getCursor() + "-2"), nextCursor));
    }

    static class Page {
        private List<String> result;
        private Integer cursor;

        public Page(List<String> result, Integer cursor) {
            this.result = result;
            this.cursor = cursor;
        }

        public List<String> getResult() {
            return result;
        }

        public Integer getCursor() {
            return cursor;
        }
    }
}
公共类松弛{
公共静态void main(字符串[]args){
getFirstPage().展开(第页->getNextPage(第页))
.flatMapIterable(页面->页面.getResult())
.subscribe(System.out::println);
}
私有静态Mono getFirstPage(){
System.out.println(“获取第一页”);
返回Mono.just(新页面(Arrays.asList(“page0-1”,“page0-2”),1));
}
专用静态Mono getNextPage(第页){
System.out.println(“获取页面”+page.getCursor());
if(page.getCursor()==null){
返回Mono.empty();
}
整数nextCursor=(page.getCursor()==5)?null:page.getCursor()+1;
返回Mono.just(新页面(Arrays.asList(“Page”+Page.getCursor()+“-1”,“Page”+Page.getCursor()+“-2”),nextCursor));
}
静态类页面{
私有列表结果;
私有整数游标;
公共页(列表结果,整数光标){
this.result=结果;
this.cursor=游标;
}
公共列表getResult(){
返回结果;
}
公共整数getCursor(){
返回光标;
}
}
}

不错。我使用这个概念来处理分页。只想确认一下,当返回
Mono.empty()
时,它将退出
展开
链和
flatMap
无论现有的iterable是什么?