我以传统方式编写了这个简单的Java for循环

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情况以跳过下一个流操作呢?提前致谢。

最佳答案

好吧,您可能会使用以下内容:

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。第一次是在流中仅保留空格或孟加拉字符,第二次是为了知道要转换哪个字符。

由于流操作是独立的-每个流之前都不知道流中发生了什么-当在传统循环中编写时,这样的操作可能会更有效。此外,在流中运行此字符串时,您会创建很多小的字符串,其中必须将所有字符转换为字符串,而不仅仅是孟加拉字符。

重要的是要注意,您这里没有“跳过”任何内容。在传统循环中,您可以跳过操作。但是在流中,跳过元素意味着它们将不在最终结果中。您在流中所做的是不更改地传递这些元素(或在这种情况下,从char更改为String),而不跳过。

09-25 20:52