【问题标题】:How we can compare two values of flux using springreactor我们如何使用 springreactor 比较两个通量值
【发布时间】:2021-04-22 22:30:52
【问题描述】:

目前我是响应式编程的新手, 我已经在 2 个文档中添加了数据,所以目前我要做的是只将那些数据返回给两个文档中 tokenIdentifier 相同的客户端。

请参考以下代码:

我有 2 个收藏有

package com.mainApp;

import java.util.Date;

import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.mapping.Document;

@Document(value = "Token")
public class TokenData {

    @Id
    private String id;
    
    private String tokenIdentifier;
    
    private Date todayDate;
    
    
    public TokenData(String id, String tokenIdentifier, Date todayDate) {
        super();
        this.id = id;
        this.tokenIdentifier = tokenIdentifier;
        this.todayDate = todayDate;
    }

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getTokenIdentifier() {
        return tokenIdentifier;
    }

    public void setTokenIdentifier(String tokenIdentifier) {
        this.tokenIdentifier = tokenIdentifier;
    }

    public Date getTodayDate() {
        return todayDate;
    }

    public void setTodayDate(Date todayDate) {
        this.todayDate = todayDate;
    }

    
    

}
package com.mainApp;

import java.util.Date;

import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.mapping.Document;

@Document(value = "TURCollection")
public class TURCollection {
    @Id
    private String id;
    
    private String turIdentifier;
    
    private String tokenIdentifier;

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getTurIdentifier() {
        return turIdentifier;
    }

    public void setTurIdentifier(String turIdentifier) {
        this.turIdentifier = turIdentifier;
    }

    public String getTokenIdentifier() {
        return tokenIdentifier;
    }

    public void setTokenIdentifier(String tokenIdentifier) {
        this.tokenIdentifier = tokenIdentifier;
    }
    
    

}

我有一个控制器,它只返回 tokenData.getTokenIdentifier() == TURCollection.getTokenIdentifier() 的那些 tokenData。

所以

@GetMapping(value = "/getAllToken")
    public Flux<TokenData> getToken(){
        /*List<TokenData> returnData = new ArrayList<TokenData>();
        List<TokenData> tokenData = tokenDataRepository.findAll().collectList().block();
        
        List<TURCollection> turCollection = turRepository.findAll().collectList().block();
        
        turCollection.forEach(tur -> {
            for(TokenData data : tokenData) {
                if(tur.getTokenIdentifier().equals(data.getTokenIdentifier())) {
                    returnData.add(data);
                }
            }
        });*/

但是 block() 代码在响应式编程中不起作用 谁能帮助我如何以反应方式比较两个通量的值?

【问题讨论】:

    标签: java spring-boot spring-webflux reactive-mongo-java


    【解决方案1】:

    您可以结合使用 Flux.collectList 和 Mono.flatMap。

    Mono<List<TokenData>> tokenData = tokenDataRepository.findAll().collectList();
    Mono<List<TURCollection>> turCollection = turRepository.findAll().collectList();
    Mono<List<TokenData>> result = turCollection.flatMap(turs ->
      Set<String> ids = turs.stream().map(TURCollection::getId).collect(toSet());
      return tokenData.map(tokens ->
        tokens.stream().filter(token -> ids.contains(token.getId())).collect(toList())
      );
    );
    

    【讨论】:

    • 感谢您的回复,但是使用这个正在发生的事情是它只给出那些 getTokenIdentifier() 在给定位置相同的记录,例如如果 getTokenIdentifier() 在第二个索引处相同,那么只有它给。我的要求是让 tokenDataRepository.findAll() 有 3 条记录,其 getTokenIdentifier() 为 xyz,turRepository.findAll() 有 1 条记录,其 getTokenIdentifier() 为 xyz。所以结果我得到了 3 条记录。简而言之,从令牌文档中搜索其令牌标识符与 TURCOllection 数据相同的所有记录。它会返回 Token 文档的所有数据。
    • @FarahnaazPathan 查看更新后的答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多