2016-09-29 51 views
-1

我不知道如何描述我想用一個好標題實現的目標。我有一個對象列表,每個對象都有一個布爾成員。我想過濾這個列表來獲得列表中的第一個對象,它們都將此布爾成員設置爲true。Java流 - 獲取連續的相同字段的對象

這是我如何做到這一點沒有流,將每個對象添加到getter方法返回true的新列表,並在第一個元素返回false時停止。

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

這是順序流的某種可能嗎?

+0

'list.stream()。過濾器(成員 - >成員:: isMemberTrue).findFirst()' – emotionlessbananas

+0

一件事,如果你無論如何首先從'名單member'是不是會員,你的循環將'break'因此請確定你在做什麼 – emotionlessbananas

+0

是的,如果第一個對象返回false,那麼結果列表可能是空的。 – Semaphor

回答

0

也許像這樣的工作:

ArrayList<YourClass> newList = new ArrayList<>(
    list.stream() 
    .filter(obj -> obj.isMemberTrue()) 
    .collect(Collectors.toList()) 
); 

記得導入java.util.stream.Collectors,如果你想將它返回一個列表。

+1

我想獲取它返回true的第一個連續對象,而不是每個返回true的對象。 – Semaphor

+0

@semaphor檢查評論:) – emotionlessbananas

+0

@Semaphor我不知道這是可能的流。 – Cicero

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

findFirst()會給你的對象,而不是索引。所以你必須實際使用子列表(0,list.indexOf(firstObject)),只要這樣的第一個對象存在。 – mtj

+0

@mtj謝謝指出,我會做編輯 – emotionlessbananas

+1

@AsteriskNinja這應該做你的工作:'int low = IntStream.range(0,list.size())。filter(i - >!list.get ⅰ).isMemberTrue())的FindFirst()OrElse運算(0);'。但要小心,如果底層實現不是'RandomAccess'列表。 – Flown

-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; 
    } 
} 
+1

你有沒有在並行執行中試過你的代碼?你獲得了相同的結果嗎?我猜不會。所以請不要在無狀態表達式中使用狀態,因爲可能會出現意外行爲。 – Flown

+0

@Flown。謝謝,進行審查。如果我把這個屬性放到ListTest類中,我會同意你的意見。所以狀態只在方法test()的調用棧中使用?!? – Dangermouse

+0

您可以在[documentation](https://docs.oracle.com/javase/8/docs/api/java/util/stream/package-plugin)中的'Stream'管道中看到一個示例, summary.html#無國籍) – Flown

相關問題