【问题标题】:How can use JAVA 8 filter for following code [closed]如何将 JAVA 8 过滤器用于以下代码 [关闭]
【发布时间】:2017-06-12 07:33:43
【问题描述】:
String url="/acct/StatsClientListService?clientType=AllClient";
List<String> urlQueryParams =new ArrayList<String>();
String clientType =null;
String urlBool = null;
List<String> urlSplit = Pattern.compile("\\?").splitAsStream(url).collect(Collectors.toList());
//condition based results
if(urlSplit.size() == 2){
    urlQueryParams=Pattern.compile("&").splitAsStream(urlSplit.get(1)).collect(Collectors.toList());
    if(urlQueryParams.size() == 2 ){
        clientType = urlQueryParams.get(0).split("=")[1];
        urlBool = urlQueryParams.get(0).split("=")[1];
        System.out.println("clientType --  "+clientType + "   urlBool ---- "+urlBool);
    }
    else{
        clientType = urlQueryParams.get(0).split("=")[1];
        System.out.println("clientType --  "+clientType);
    }
}
else{
    System.out.println("url without params");
}

【问题讨论】:

  • 你试过什么?这不是代码编写服务。
  • 为什么需要过滤器?你到底想做什么?
  • 我想使用 java-8 功能,我想拆分动态 url,它可能不包含 1 和 2 个查询参数并设置为变量。如何使用 java-8 过滤器和可选

标签: java java-8


【解决方案1】:

跟随 sn-p 可能是一个起点。

URL url = new URL("http://example.com/acct/StatsClientListService"
        + "?clientType=AllClient&something=interesting");
Stream.of(url.getQuery().split("&"))
        .collect(Collectors.toMap(
                s -> s.replaceFirst("^(.*)=.*", "$1"), 
                s -> s.replaceFirst("^.*=(.*)", "$1")))
        .forEach((k, v) -> 
                System.out.printf("param: %s  value: %s%n", k, v)
        );

输出

param: clientType  value: AllClient
param: something  value: interesting

编辑如果 URL 字符串只包含路径和(可选的)查询,您可以从这个 sn-p 开始。

String urlString = "/acct/StatsClientListService"
        + "?clientType=AllClient&something=interesting";
if (urlString.contains("?")) {
    String query = urlString.substring(urlString.indexOf("?") + 1);
    Stream.of(query.split("&"))
        .collect(Collectors.toMap(
                s -> s.replaceFirst("^(.*)=.*", "$1"),
                s -> s.replaceFirst("^.*=(.*)", "$1")))
        .forEach((k, v)
                -> System.out.printf("param: %s  value: %s%n", k, v)
        );
}

输出

param: clientType  value: AllClient
param: something  value: interesting

注意需要对urlString 进行额外检查。取决于可能的值。

【讨论】:

  • 谢谢,但是这个 url 是动态的,可能包含查询字符串,也可能不包含。在不包含查询字符串的情况下获取 nullPointerException。
  • 这就是为什么在我的 sn-p 代码中,我使用大小检查条件,然后进一步拆分。
  • sn-ps 并不是一个完整的解决方案。见might be a point to start with。它演示了查询参数的拆分。在执行之前放置一个简单的if (url.getQuery() == null) ... 应该是直截了当的。
  • 我得到的Url不是完整的Url(我的意思不是以“example .....”开头),所以不能使用URL对象及其方法。
  • @user2902870 我为没有主机部分的 URL 字符串添加了另一个示例。由于您仍然没有提出问题,因此在您的帖子标题旁边很难猜出您想要实现的目标。我的 sn-ps 或多或少是不完整的猜测工作。 ;-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-09-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-19
  • 1970-01-01
  • 2019-08-16
相关资源
最近更新 更多