2015-10-24 132 views
4

我正在寫一個Xor方法,它通過向其字符添加(作爲xor操作)隨機值來使一些字符串ecnrypts。結果應該看起來像帶有加密字符十六進制值的字符串。使用Java 8流將字符串分隔爲字符串(lambdas)

實施例:

你好世界」=> 「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);

如何在流中直接格式化正確的結果?

回答

6

你想要的是將一個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和變異的外部對象。
  • 沒有必要刪除最後一個字符。