2 回答
TA贡献1818条经验 获得超7个赞
filter()生成一个新流,其中包含满足谓词(您提供的条件)的原始元素。你想要的是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"));
TA贡献1852条经验 获得超1个赞
如果你真的想要使用流来实现它,你需要在较低级别上应用过滤逻辑 - 而不是在字符串流上,在单个字符串中的字符流上应用:
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
而不是一个常规的Object流。)
如果需要,您可以将其包装到一个处理多个字符串的流中 - 然后上面的逻辑将map
在该流的操作中。
添加回答
举报