Java 8+;中是否有要突破的均衡;溪流?

Java 8+;中是否有要突破的均衡;溪流?,java,lambda,java-8,java-stream,break,Java,Lambda,Java 8,Java Stream,Break,我正在尝试根据条件筛选列表。是否有其他方法可以中断Java8流以停止过滤 举个例子:假设我有下面的列表 List<String> list = Arrays.asList("Foo","Food" ,"Fine","Far","Bar","Ford","Flower","Fire"); list.stream() .filter(str -> str.startsWith("F")) //break when str doesn't start with F

我正在尝试根据条件筛选列表。是否有其他方法可以中断Java8流以停止过滤

举个例子:假设我有下面的列表

List<String> list = Arrays.asList("Foo","Food" ,"Fine","Far","Bar","Ford","Flower","Fire");

list.stream()
        .filter(str -> str.startsWith("F")) //break when str doesn't start with F
        .collect(Collectors.toList());
List List=array.asList(“Foo”、“Food”、“Fine”、“Far”、“Bar”、“Ford”、“Flower”、“Fire”);
list.stream()
.filter(str->str.startsWith(“F”)//当str不以F开头时中断
.collect(Collectors.toList());
我希望所有以“F”开头的字符串都从一开始,一旦发现一个不以“F”开头的字符串,我就要停止过滤。如果没有流,我将执行以下操作:

List<String> result = new ArrayList<>();
for(String s : list){
    if(s.startsWith("F")){
        result.add(s);
    }
    else{
        break;
    }
}
List result=new ArrayList();
用于(字符串s:列表){
如果(s.startsWith(“F”)){
结果。添加(s);
}
否则{
打破
}
}

如何在流中使用“break”?

您可以在Java9中使用
takeWhile
操作符,它正好满足您的需要。这是它的样子

List<String> res = list.stream()
    .takeWhile(s -> s.startsWith("F"))
    .collect(Collectors.toList());
List res=List.stream()
.takeWhile(s->s.startsWith(“F”))
.collect(Collectors.toList());

您可以在Java9中使用
takeWhile
操作符,它正好满足您的需要。这是它的样子

List<String> res = list.stream()
    .takeWhile(s -> s.startsWith("F"))
    .collect(Collectors.toList());
List res=List.stream()
.takeWhile(s->s.startsWith(“F”))
.collect(Collectors.toList());

这里有一个使用Java 8的选项:

AtomicBoolean=new-AtomicBoolean(true);
list.stream()
.peek(s->keepAdding.set(keepAdding.get()&s.startsWith(“F”))
.filter->keeppadding.get();
以及另一种可能性,从评论中可以明显看出,上述方法不受欢迎:

list.subList(0,list.indexOf(list.stream().filter)(s->!s.startsWith(“F”))
.findFirst()
.orElse(list.get(list.size()-1));

这里有一个使用Java 8的选项:

AtomicBoolean=new-AtomicBoolean(true);
list.stream()
.peek(s->keepAdding.set(keepAdding.get()&s.startsWith(“F”))
.filter->keeppadding.get();
以及另一种可能性,从评论中可以明显看出,上述方法不受欢迎:

list.subList(0,list.indexOf(list.stream().filter)(s->!s.startsWith(“F”))
.findFirst()
.orElse(list.get(list.size()-1));

您能使用Java 9+吗?如果是这样,请参见。@Slaw我还不知道这个函数。我大概一个小时都在想办法。非常感谢,takeWhile正是我需要的。你能使用Java 9+吗?如果是这样,请参见。@Slaw我还不知道这个函数。我大概一个小时都在想办法。非常感谢,takeWhile正是我需要的。我还不知道这个函数。我大概一个小时都在想办法。非常感谢,这正是我需要的。我还不知道这个函数。我大概一个小时都在想办法。非常感谢,这正是我所需要的。但是,这并不能保证表现得像预期的那样。@daniu怎么会这样?你能给出一个例子吗?当使用
peek
进行控制迭代的操作时,过滤器不应该是关于不确定性的有状态的提示。我必须召集@Holger来做这件事,我见过他在这个话题上多次与人(包括我)碰头。编辑:aa我被纳曼用一个链接链接到了霍尔格的一篇帖子:道弗,这不能保证表现得像预期的那样。@daniu怎么会这样?你能给出一个例子吗?当使用
peek
进行控制迭代的操作时,过滤器不应该是关于不确定性的有状态的提示。我必须召集@Holger来做这件事,我见过他在这个话题上多次与人(包括我)碰头。编辑:aa我已经被纳曼用一个链接链接到霍尔格的帖子:d