使用流将字符串转换为以分隔符分隔的整数序列

4

所以,我有一个由自动生成的符号组成的单词列表。例如:hqst。我将该单词的每个符号转换为Unicode,并用点.连接起来,如下所示:104.113.115.116

我编写了以下lambda函数:

.map(word -> {
    char[] symbols = word.toCharArray();
    StringBuilder newWord = new StringBuilder();

    for (int i = 0; i < symbols.length; i++) {
        newWord.append((int) symbols[i]).append(".");
        if (i == symbols.length - 1) {
            newWord = new StringBuilder(newWord.substring(0, i));
        }
    }
    return newWord.toString();
})

这个匿名方法能否使用流API进行重写?

你们不是已经在使用Stream API了吗?你将这个lambda表达式传递给哪个map方法? - Eran
顺便提一下,使用 newWord = new StringBuilder(newWord.substring(0, i)); 可能是最昂贵的选择,只需说 newWord.setLength(i); 即可。此外,您可以在循环之后仅执行一次 newWord.setLength(Math.max(0, symbols.length - 1); 而不是将 isymbols.length - 1 进行比较。整个代码可以在不复制整个 Stringchar[] 数组的情况下工作,只需使用 charAt(i) - Holger
尽管如此,再看一遍你的代码,它似乎并不正确,实际上你想要的很可能是在循环之后使用 if(newWord.length() > 0) newWord.setLength(newWord.length() - 1); 来移除最后一个 '.' 而不是将结果字符串设置为原始字符串长度减一。所以整个代码可以简化为 .map(word -> { StringBuilder newWord = new StringBuilder(); for( int i = 0; i < word.length(); i++) newWord.append((int)word.charAt(i)).append('.'); return newWord.substring(0, Math.max(0, newWord.length()-1)); }) - Holger
2个回答

4

可以使用 String::chars 方法从字符串中获取一个 IntStream 流,然后将每个 int 映射为一个字符串并用 joining collector 进行收集:

.map(word -> word.chars()
                 .mapToObj(Integer::toString)
                 .collect(Collectors.joining("."))
)

0

假设单词已经按照您提供的样例值存储在整数值列表中(因为您没有提供完整的代码片段),我相信这会有所帮助。

 public static void main(String[] args) {
    List<Integer> list = new ArrayList<>();
    list.add(104);
    list.add(113);
    list.add(115);
    list.add(116);
   String str =  list.stream().map(word->word.toString()).collect(Collectors.joining( "." ));
   System.out.println(str);
}

代码非常清晰,完整呈现。该单词是一个字符串,而不是整数列表。在他的“hqst”示例中,h变成了104,q变成了113,s变成了115,t变成了116。 - Michael

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接