Java 如何从流中删除数字和空格?

Java 如何从流中删除数字和空格?,java,arrays,filter,java-stream,Java,Arrays,Filter,Java Stream,我试图将args转换为流。然后流必须变成大写,从字符串中删除数字和空格,而不是整个字符串。 创建stream和uppercase成功地工作了,现在我被filter方法卡住了,我不明白为什么我的代码不能工作,我已经做了一些研究 包A_11; 导入java.util.array; 导入java.util.stream.stream; 公共A级11(g){ 公共静态无效字符串[]args{ Stream=Arrays.streamargs; stream.maps->s.toUpperCase.fil

我试图将args转换为流。然后流必须变成大写,从字符串中删除数字和空格,而不是整个字符串。 创建stream和uppercase成功地工作了,现在我被filter方法卡住了,我不明白为什么我的代码不能工作,我已经做了一些研究

包A_11; 导入java.util.array; 导入java.util.stream.stream; 公共A级11(g){ 公共静态无效字符串[]args{ Stream=Arrays.streamargs; stream.maps->s.toUpperCase.filters->Character.isDigits.filtere->!e.isEmpty .forEachname->System.out.printname+; } }
过滤器生成一个新的流,其中包含满足您提供的条件谓词的原始元素。 您需要的是map函数,它在将给定函数应用于原始流的每个元素后生成一个新流

下面的代码应该可以做到这一点,在底部有一些断言,您可以选择使用它们在单元测试中进行验证

Stream<String> stringStream = Stream.of("unfiltered", "withDigit123", " white space ");

List<String> filtered = stringStream.map(s -> s.toUpperCase())//Can be replaced with .map(String::toUpperCase) if you want, but did it this way to make it easier to understand for someone new to all this.
        .map(s -> s.replaceAll("[0-9]", ""))//Removes all digits
        .map(s -> s.replace(" ", ""))//Removes all whitespace
        .collect(Collectors.toList());//Returns the stream as a list you can use later, technically not what you asked for so you can change or remove this depending on what you want the output to be returned as.

//Assertions, optional.
assertTrue(filtered.contains("UNFILTERED"));
assertTrue(filtered.contains("WITHDIGIT"));
assertTrue(filtered.contains("WHITESPACE"));
如果您真的想使用流进行过滤,则需要在较低级别上应用过滤逻辑,而不是在字符串流上,通过在单个字符串中的字符流上应用过滤逻辑:

System.out.println(
    "abcd 123 efgh".chars()
        .map(Character::toUpperCase)
        .filter(c -> !Character.isDigit(c))
        .filter(c -> !Character.isSpaceChar(c))
        .mapToObj(c -> String.valueOf((char) c))
        .collect(Collectors.joining())
);
ABCDEFGH

mapToObj部分是为了避免必须处理定制收集器,否则会需要定制收集器,因为流是IntStream而不是常规对象流


如果需要,您可以将其包装到一个处理多个字符串的流中-上述逻辑将位于该流上的映射操作中。

当您说filter时,您的意思是要从提供的字符串中删除数字和空格,还是要删除包含数字/空格的任何字符串?我想从流中删除数字和空格,我认为过滤器是实现此目的的正确方法。您拥有的是一个流,您想删除带条件的字符串吗还是其中的人物?尽管您可能正在查找stream.mapString::toUpperCase.filters->!StringUtils.isNumerics | |!s、 isEmpty.forEachname->System.out.printname+;,使用apache commons中的StringUtils。是,但是从流中删除包含数字/空格的字符串,还是从流的字符串中删除数字/空格?Filter执行第一个操作,仅当每个元素满足提供的谓词时才接受过滤流中的每个元素。@FrancisDrake您可能应该回答您的问题以明确要求,换句话说,将注释回复合并到问题本身中。当您理解replaceAll[0-9]的作用时,您应该很容易认识到,它只需要稍作更改,即replaceAll[0-9],就可以删除空格字符。