繁体   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