Java流 - 获取连续相同字段的对象

时间:2016-09-29 06:31:19

标签: java java-8 java-stream

我不知道如何用一个好头衔来描述我想达到的目标。我有一个对象列表,每个对象都有一个布尔成员。我想过滤这个列表,最后得到列表中第一个将这个布尔成员设置为true的对象。

如果没有流,我会这样做,将每个对象添加到getter方法返回true的新列表中,并在第一个元素返回false时停止。

int i = 0;
while(i < list.size()){
    if(!list.get(i).isMemberTrue()){
        break;
    }
    else{
        newList.add(list.get(i));
    }
    i++;
}

这是否可以通过顺序流实现?

3 个答案:

答案 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;
    }
}