以传统方式,我编写了这个简单的java for loop
public String setString(String string) {
StringBuilder stringBuilder = new StringBuilder();
// This for loop I want to convert into stream.
for (char c : string.toCharArray()) {
if (Character.isSpaceChar(c))
stringBuilder.append(c);
else if (isBangla(c))
stringBuilder.append(get(c));
}
return stringBuilder.toString();
}
String get(int c) {
return keyMap.getMap((char) c); // Map<Character, String> keyMap
}
boolean isBangla(int codePoint) {
return ((codePoint >= BANGLA_CHAR_START && codePoint <= BANGLA_CHAR_END) &&
(codePoint <= BANGLA_NUMBER_START || codePoint >= BANGLA_NUMBER_END)));
}
我试过这样的事情。
String str = string.chars()
.filter(i -> Character.isSpaceChar(i)) // if this is true need to add string
.filter(this::isBangla)
.mapToObj(this::get)
.collect(Collectors.joining());
我想要做的是,如果第一个过滤器检测到它是spaceChar
,那么它将不会进行任何进一步的流处理,而是跳转到collect
。
那么我怎样才能实现这种if/else
情况以跳过下一个流操作?提前致谢。
答案 0 :(得分:6)
嗯,你可以使用这样的东西:
String str = string.chars()
.filter( ch -> Character.isSpaceChar(ch) || isBangla(ch) )
.mapToObj( ch -> isBangla(ch) ? get(ch) : Character.toString((char)ch))
.collect(Collectors.joining());
如您所见,此流检查isBangla
两次。第一次是只留下流中的空格或bangla字符,第二次是为了知道要转换哪些字符。
因为流操作是独立的 - 每个流都不知道流之前发生了什么 - 当在传统循环中编写时,这样的操作可能更有效。更重要的是,当你在流中运行它时,你创建了许多小字符串,你必须将所有字符转换为字符串,而不仅仅是bangla字符串。
重要的是要注意,你没有&#34;跳过&#34;这里有什么。在传统循环中,您可以跳过操作。但是在流中,跳过元素意味着它们不会出现在最终结果中。您在流中执行的操作是将这些元素保持不变(或者在这种情况下,从char
更改为String
),而不是跳过。