【问题标题】:Add space as split to strings using Java 8 stream (lambdas)使用 Java 8 流 (lambdas) 将空格作为拆分添加到字符串
【发布时间】:2015-10-24 11:33:33
【问题描述】:

我正在编写一个 Xor 方法,该方法通过向其字符添加(作为 xor 操作)随机值来加密某些字符串。结果应该看起来像带有加密字符的十六进制值的字符串。

示例:

"Hello world" => "0006F 00046 00066 00076 0004D 0007F 00047 0007D 00062 0006E"

代码:

StringBuilder sb = new StringBuilder();

inputText.chars()                                      // get char stream
         .filter(c -> c != ' ')                         // remove spaces
         .map(c -> c ^ random.nextInt(randBound))       // do xor for each char
         .boxed()                                       // to Integer stream
         .map(i -> String.format("%05X ", i & 0xFFFFF)) // to Hex String values
         .forEach(sb::append);

if (sb.length() > 0)
    sb.deleteCharAt(sb.length() - 1);

return sb.toString();

如您所见,我已将结果格式化为"%05X ",因此字符串末尾有多余的空格。并且需要使用sb.deleteCharAt(sb.length() - 1);

如何直接在流中格式化正确的结果?

【问题讨论】:

    标签: java string lambda java-8 java-stream


    【解决方案1】:

    您想要的是将 Stream 的元素收集到 String 中。这可以使用Collectors.joining(delimiter)

    inputText.chars() // get char stream
             .filter(c -> c != ' ') // remove spaces
             .map(c -> c ^ random.nextInt(randBound)) // do xor for each char
             .mapToObj(i -> String.format("%05X", i & 0xFFFFF)) // to Hex String values
             .collect(joining(" "));  // join each value together, separated with a space
    

    这样做的好处是:

    • 无需使用forEach 来改变外部对象。
    • 无需删除最后一个字符。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多