簡體   English   中英

用另一個流中的字符串替換一個流的字符串

[英]Replace string of one stream with string in another stream

有趣的流...我有一個標記化URL的List<String> ,以及這些標記的所有參數值的List<UrlParametersConfig.UrlParameter> 例如,我的yaml文件看起來像:

urlParameterList:
  urlParameter:
  -
    parameter: propertyId
    value: c3329fc
 -
    parameter: cartId
    value: 123456
 ...

相應的配置類如下所示:

@Configuration
@ConfigurationProperties(prefix="urlParameterList")
public class UrlParametersConfig {

    private List<UrlParameter> urlParameters = new ArrayList<>();

    public UrlParametersConfig() {}

    public List<UrlParameter> getUrlParameter() { return this.urlParameters; }

    public static class UrlParameter {
        private String parameter;
        private String value;

        public String getParameter() {
            return parameter;
        }
        public void setParameter(String parameter) {
            this.parameter = parameter;
        }
        public String getValue() {
            return value;
        }
        public void setValue(String value) {
            this.value = value;
        }
    }
}

所以我有一個URL列表,其中包含www.comany.com/v2/rest/v2/property/{propertyId} www.comany.com/v2/rest/v2/sale/{propertyId}/{cartId}

引用{propertyId}到處我需要替換c3329fc ,並且引用{cartId}到處都需要替換123456a 我想我將使用兩個流,但我不知道首先流,哪個URL列表或配置參數列表。 任何人都可以告訴我這個令牌替換代碼應該是什么樣子? 到目前為止,這就是我所擁有的:

List<String> parameterizeUrls = uris.stream()
        .forEach(it -> {
            if (it.contains(parameters.stream()
                  .map(UrlParametersConfig.UrlParameter::getParameter)
                  .collect(Collectors.toList()))
   // do something?
        });

如果我理解了這個想法,我們想獲得以下內容:

www.comany.com/v2/rest/v2/property/c3329fc
www.comany.com/v2/rest/v2/sale/c3329fc/123456

需要一個流來循環使用令牌的原始url列表。 對於每個url ,另一個流將在參數列表上循環,執行每個參數的url減少。

為了更清楚並避免過多的嵌套,算法分為以下幾部分:

1)主循環,將帶有標記的URL的原始列表轉換為具有替換值的URL:

List<String> urlsTokenReplaced = urls.stream().map(url ->
  replaceTokens(url, params)
).collect(Collectors.toList());

2)對於指定的url ,從列表中替換每個標記的出現次數。

private static String replaceTokens(String url, List<UrlParametersConfig.UrlParameter> params) {
  return params.stream()
               .reduce(url, {ClassName}::replaceToken, (prev, cur) -> cur);
}

更新

有關還原操作如何工作的詳細信息: Java教程

對於這個特殊情況:

  • url param是循環的起始值,例如www.comany.com/v2/rest/v2/sale/{propertyId}/{cartId}

  • {ClassName}::replaceToken引用下面的靜態方法,它是所謂的累加器函數,它接受先前(或起始)值並通過在其上應用當前UrlParameter來生成新值。 在我們的案例中,在第一次通過時,它將生成www.comany.com/v2/rest/v2/sale/c3329fc/{cartId}www.comany.com/v2/rest/v2/sale/c3329fc/123456第二。

  • (prev, cur) -> cur)是所謂的收集函數。 它定義了如何處理prev ious和cur rent(由累加器產生)值。 在這里,我們忘記前一個值並返回當前的值,這將在循環的下一次迭代中由累加器重用,依此類推。 在我們的例子中,在第一遍中它將返回www.comany.com/v2/rest/v2/sale/{propertyId}/{cartId}www.comany.com/v2/rest/v2/sale/c3329fc/{cartId}之間的第二個值。 www.comany.com/v2/rest/v2/sale/c3329fc/{cartId} 在第二遍,它將從www.comany.com/v2/rest/v2/sale/c3329fc/{cartId}www.comany.com/v2/rest/v2/sale/c3329fc/123456返回第二個值。

當流中的所有UrlParameter都通過時,從該方法返回由累加器(以及此處的收集器)生成的最后一個值。 如果流為空,則返回起始值(第一個arg)。

ENF-的更新

3)在url替換指定標記的單個匹配項:

private static String replaceToken(String url, UrlParametersConfig.UrlParameter param) {
  String replaceRegex = "\\{" + param.getParameter() + "\\}";
  return url.replaceAll(replaceRegex, param.getValue());
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM