C-6ren">
gpt4 book ai didi

java - 使用流来操作字符串

转载 作者:太空狗 更新时间:2023-10-29 22:34:07 25 4
gpt4 key购买 nike

假设我想从我的 String 中删除所有非字母。

String s = "abc-de3-2fg";

我可以使用 IntStream 来做到这一点:

s.stream().filter(ch -> Character.isLetter(ch)).  // But then what?

如何将此流转换回 String 实例?

换句话说,为什么我不能将 String 视为 Character 类型的对象流?

String s = "abc-de3-2fg";

// Yields a Stream of char[], therefore doesn't compile
Stream<Character> stream = Stream.of(s.toCharArray());

// Yields a stream with one member - s, which is a String object. Doesn't compile
Stream<Character> stream = Stream.of(s);

根据javadoc,Stream的创建签名如下:

Stream.of(T... values)

我能想到的唯一(糟糕的)方法是:

String s = "abc-de3-2fg";
Stream<Character> stream = Stream.of(s.charAt(0), s.charAt(1), s.charAt(2), ...)

当然,这还不够好......我错过了什么?

最佳答案

这是问题第二部分的答案。如果你有 IntStream调用 string.chars() 的结果你可以获得Stream<Character>通过转换为 char然后通过调用 mapToObj 装箱结果.例如,这里是如何将 String进入 Set<Character> :

Set<Character> set = string.chars()
.mapToObj(ch -> (char)ch)
.collect(Collectors.toSet());

请注意转换为 char对于盒装结果是 Character 是必不可少的而不是 Integer .

现在处理char的大问题|或 Character数据是补充字符表示为 char代理对值,所以任何处理个人的算法char带有增补字符的值可能会失败。

(增补字符似乎是一个我们不需要担心的晦涩的 Unicode 特性,但据我所知,所有表情符号都是增补字符。)

考虑这个例子:

string.chars()
.filter(Character::isAlphabetic)
...

如果出现包含代码点 U+1D400(数学粗体大写字母 A)的字符串,这将失败。该代码点表示为字符串中的代理项对,并且代理项对的值都不是字母字符。要获得正确的结果,您需要改为执行以下操作:

string.codePoints()
.filter(Character::isAlphabetic)
...

我建议始终使用 codePoints() .

现在,给定一个 IntStream代码点,如何将它重新组合成一个字符串? Sleiman Jneidi's answer是一个合理的 (+1),使用三参数 collect() IntStream的方法| .

这里有一个替代方案:

StringBuilder sb = ... ;
string.codePoints()
.filter(...)
.forEachOrdered(sb::appendCodePoint);
return sb.toString();

如果您已经有一个 StringBuilder,这可能会更灵活一些。你用来积累字符串数据的。您不必创建新的 StringBuilder每次,也不必将其转换为 String之后。

关于java - 使用流来操作字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31977356/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com