Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 用另一个流中的字符串替换一个流中的字符串_Java_Java 8_Java Stream_Str Replace - Fatal编程技术网

Java 用另一个流中的字符串替换一个流中的字符串

Java 用另一个流中的字符串替换一个流中的字符串,java,java-8,java-stream,str-replace,Java,Java 8,Java Stream,Str Replace,流的乐趣。。。我有一个标记化URL的列表,以及这些标记的所有参数值的列表。例如,我的yaml文件如下所示: urlParameterList: urlParameter: - parameter: propertyId value: c3329fc - parameter: cartId value: 123456 ... 相应的配置类如下所示: @Configuration @ConfigurationProperties(prefix="urlP

流的乐趣。。。我有一个标记化URL的
列表
,以及这些标记的所有参数值的
列表。例如,我的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/c3329fc
www.comany.com/v2/rest/v2/sale/c3329fc/123456
需要一个流来循环原始
url
s列表中的令牌。对于每个
url
,另一个流将在参数列表上循环,对每个参数执行
url
的缩减

为了更清楚,避免嵌套过多,algo分为以下几个部分:

1) 主循环,将带有标记的原始URL列表转换为带有替换值的URL:

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

有关缩减操作如何工作的详细信息:

对于这种特殊情况:

  • 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/123456
    返回第二个值

当流中的所有
UrlParameter
s被传递时,累加器(以及此处的收集器)生成的最后一个值将从方法返回。如果流为空,将返回起始值(第一个参数)

更新的enf

3) 替换
url
中指定标记的单个匹配项:

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

假设您正在使用Spring,您可能会感兴趣的东西有
PropertyPlaceHolderConfigure
。。。只是说说。你能给我看看那会是什么样子吗?谢谢,这是一个很大的工作。但是我在
url.replaceAll()
行上得到了一个
PatternSyntaxException
。它说
索引9\{/brands/{id}}
附近非法重复。url参数为
https://dev1.company.com/v2/trips/{id}/items/{itemId}/notifications
,参数为
/brands/{id}
。我不明白什么,因为我们根本不应该尝试在那里进行替换…这是因为字符串
\{/brands/{id}\}
包含未替换的大括号。每个内支撑前都应该有一个反斜杠<应调整代码>替换正则表达式
,以考虑此类情况。通常,
/brands/{id}
不应用作令牌/参数名。这应该只是
id
。不幸的是,URL在WADL中有括号。但是我在调用
replaceTokens
之前就把它们去掉了,它可以工作了!你能给我解释一下
reduce
方法在做什么吗?我还没有完全理解……我更新了答案,解释了
reduce
在这种情况下的工作原理。希望有帮助。
private static String replaceTokens(String url, List<UrlParametersConfig.UrlParameter> params) {
  return params.stream()
               .reduce(url, {ClassName}::replaceToken, (prev, cur) -> cur);
}
private static String replaceToken(String url, UrlParametersConfig.UrlParameter param) {
  String replaceRegex = "\\{" + param.getParameter() + "\\}";
  return url.replaceAll(replaceRegex, param.getValue());
}