有趣的流...我有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;
}
}
}
所以我有一个包含类似内容的网址列表
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?
});
答案 0 :(得分:2)
如果我理解了这个想法,我们希望获得以下内容:
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 tutorials。
对于这个特例:
url
param是循环的起始值,例如www.comany.com/v2/rest/v2/sale/{propertyId}/{cartId}
。
{ClassName}::replaceToken
引用下面的静态方法,它是所谓的 accumulator 函数,它接受先前(或开始)的值,并通过应用当前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
租金(由累加器生成)值。在这里,我们忘记前一个值并返回当前的值,这将在循环的下一次迭代中由累加器重用,依此类推。在我们的情况下,在第一次传递时,它将返回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/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());
}