【问题标题】:Concatenate Multiple variables to a String in Java If Else Block在 Java If Else Block 中将多个变量连接到一个字符串
【发布时间】:2017-02-26 18:38:28
【问题描述】:

我需要创建一个字符串,该字符串成为 SHA 256 函数的输入,以生成其等效哈希值。该字符串是通过连接几个变量来创建的,如下所示:

String strRequest = "";

strRequest = request_passphrase.concat("access_code=").concat(access_code).concat("amount=").concat(amount).concat("command=").concat(mode).concat("currency=").concat(currency).concat("merchant_identifier=").concat(merchant_identifier).concat(request_passphrase);
if(strRequest!="" || !strRequest.isEmpty()) {
  signature = sha256(strRequest);
}

创建 if-else 以删除 null 变量的串联的最佳方法应该是什么。

例如。如果 access_code 为 Null 或为空,则字符串将为 request_passphrase.concat("amount=").concat(amount)。等等。

【问题讨论】:

  • 你听说过Map吗?在这里会很有用。附言您似乎正在构建一个查询字符串。搜索该词会找到很多。
  • 注意:strRequest!="" || !strRequest.isEmpty() 始终为真,给定上一行。而strRequest != "" 几乎肯定不会检查你认为它做了什么。
  • 谢谢安迪。现在已经改正了。现在使用 && 而不是 OR 并使用 strRequest ! = null。
  • 感谢您的快速投票!

标签: java if-statement null concat string-concatenation


【解决方案1】:

根据您的上下文,合理的答案可能是以不同方式组织您的数据:

request_passphrase.concat("access_code=").concat(access_code)

您可以传递某种形式的Map<String, String>,而不是一个平面的字段列表(或更糟糕的是:方法参数) - 其中键表示“字段名称”,例如(“access_code”);并且地图值代表了相应的值。如果该值为 null,您就知道不要附加它。

然后您可以简单地迭代该映射对象,提取键/值对并将它们附加到该字符串。也许您需要一个额外的列表来告诉您应该迭代映射键的顺序

如前所述:这些是选项。为了做出明确的决定,人们应该更多地了解上下文;底层的“数据模型”;其他要求等。有一点可以肯定:if/else 链从不是个好主意。

【讨论】:

  • 我相信您的解决方案非常好(赞成)。我确实理解这个问题,但不知道如何进入可选变量的 name。根据 OP 想要做什么,Map<String, String>Map<String, Optional<String>> 可能最适合他/她。
  • 另一方面,java 之父说:可选值只能用作方法的返回类型(例如参见stackoverflow.com/questions/31922866/…)。
【解决方案2】:

在 Java 8 中包装字符串 Optional:

Optional<String> accessCode = Optional.ofNullable("access");
Optional<String> addressCode = Optional.ofNullable(null);

System.out.println(accessCode.orElse("It was null."));
System.out.println(addressCode.orElse("It was null."));

在您的特定情况下,"It was null." 应替换为空字符串。

此外。使用StringBuilder 的实例来最小化String 构造函数调用。
典型用法:

StringBuilder outputBuilder = new StringBuilder("");
while (condition) {
    outputBuilder.append(" another chunk ");
}
outputBuilder.append("end.");
String outputString = outputBuilder.toString();

此外,您可以使用Map&lt;String, Optional&lt;String&gt;&gt; 过滤掉“可空”参数。
这将是一个非常好的主意。

【讨论】:

  • 根据字符串的数量,concat() 可能比 StringBuilder 更好...见stackoverflow.com/questions/47605/…
  • @GhostCat 真的是你对这个答案能说的最糟糕的话吗?如果只有两个字符串,那么无论哪种方式都会很快。
  • @PatrickParker 是什么让你这么认为;您不是版主;所以你已经看不到我和格雷格之间来回的cmets ;-) ...并提示:如果我确实抱怨答案的质量,那么人们会注意到。在这里,我什至投了赞成票。我只是想指出,事情并不是那么简单的性能明智;-)
  • @GhostCat 我的意思是,我可以通过这个答案看到很多不好的事情。但这不是其中之一。
  • 您可以随时介入、编辑或添加特定评论。我不止一次地体验过建设性的批评很受赞赏。特别是。正如大多数人所理解的那样,解决问题可能会带来支持。
猜你喜欢
  • 1970-01-01
  • 2012-02-02
  • 2014-03-15
  • 2016-08-08
  • 2018-01-06
  • 2021-02-14
  • 1970-01-01
  • 2014-07-28
  • 2011-06-17
相关资源
最近更新 更多