如何在Java8流中执行条件操作以跳过下一个流操作?

如何在Java8流中执行条件操作以跳过下一个流操作?,java,java-8,java-stream,Java,Java 8,Java Stream,我用传统的方式编写了这个简单的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

我用传统的方式编写了这个简单的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)));
}
我想做的是,如果第一个过滤器检测到它是
spaceChar
,那么它将不会进行任何进一步的流处理,而是跳入
收集


那么,我如何实现这种
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
),而不是跳过。

您无法通过流实现if/else。@realpoint yes。如果它是一个空格字符,那么我不需要检查下两个操作。但是,我还需要映射到obj,因为它是IntStream。但正如您在我的for循环中所看到的,这并不是必需的,问题是为什么您希望它成为一个流。您的循环正确且高效地执行此操作。在流中,您可能需要两次检查它是否是孟加拉语-一次用于过滤,一次用于映射。“所以它的效率较低。”我只是想知道如何才能将其转化为流。但是我找不到解决这个问题的办法。你能解释一下你所说的创建大量小字符串的意思吗?从您上一段中我了解到,所有字符都转换为字符串,但没有添加到最终结果中。@seal当您将流转换为对象时,所有字符都将成为字符串对象,然后才被收集<代码>字符串是不可变的,因此临时对象被复制到最终结果中。因此,您创建了一个临时对象,它占用了一点内存,需要进行垃圾收集,这是您在使用
StringBuilder
时没有的,因为您没有将其转换为
String
,而是将字符直接写入
StringBuilder
。但是为什么所有字符都成为字符串对象呢?过滤方法不是只过滤孟加拉语和空格字符吗?@seal是的,我基本上是说空格字符。在原始循环中,它们作为
char
添加到
StringBuilder
中,没有任何字符串。在流中,它们被映射到新的string对象,然后收集所有的字符串(bangla字符串和space字符串)。
String str = string.chars()
           .filter( ch -> Character.isSpaceChar(ch) || isBangla(ch) )
           .mapToObj( ch -> isBangla(ch) ? get(ch) : Character.toString((char)ch))
           .collect(Collectors.joining());