[英]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.