我不知道如何用一个好头衔来描述我想达到的目标。我有一个对象列表,每个对象都有一个布尔成员。我想过滤这个列表,最后得到列表中第一个将这个布尔成员设置为true的对象。
如果没有流,我会这样做,将每个对象添加到getter方法返回true的新列表中,并在第一个元素返回false时停止。
int i = 0;
while(i < list.size()){
if(!list.get(i).isMemberTrue()){
break;
}
else{
newList.add(list.get(i));
}
i++;
}
这是否可以通过顺序流实现?
答案 0 :(得分:0)
也许这样的事情会起作用:
ArrayList<YourClass> newList = new ArrayList<>(
list.stream()
.filter(obj -> obj.isMemberTrue())
.collect(Collectors.toList())
);
如果要将其作为列表返回,请记得导入java.util.stream.Collectors。
答案 1 :(得分:0)
您可以使用此代码获取列表
list.subList(0,list.indexOf(list.stream()
.filter(member->!member::isMemberTrue)
.findFirst()
.orElse(list.size()))
或者您可以将其用作
int endIndex=list.indexOf(list.stream()
.filter(member->!member::isMemberTrue)
.findFirst()
.orElse(list.size());
然后
list.sublist(0,endIndex);
在此我通过使用List :: sublist(..)and then I am using
lambda`来获取新列表,以便在条件变为false之前获取所有成员。
经Flown审核后,我更新了答案 希望这可以帮助! :)
答案 2 :(得分:-1)
您可以使用流来实现解决方案。请记住列表中的前任。
public class ListTest
{
@Test
public void test()
{
List<Foo> list = new ArrayList<>();
list.add(new Foo(true));
list.add(new Foo(true));
list.add(new Foo(true));
list.add(new Foo(false));
list.add(new Foo(false));
list.add(new Foo(true));
list.add(new Foo(true));
List<Foo> firstSequence = list.stream().filter(new Predicate<Foo>() {
private boolean inFirstSequence = true;
@Override
public boolean test(Foo foo)
{
// turns into false, if first false value is found
inFirstSequence = inFirstSequence && foo.b;
return inFirstSequence;
}
}).collect(Collectors.toList());
Assert.assertEquals(3, firstSequence.size());
}
private class Foo
{
public Foo(boolean b)
{
super();
this.b = b;
}
boolean b = true;
}
}