2017-05-04 365 views
0

尋找在項目中使用某些流並替換當前實現的一些邏輯。不確定這種情況是否適合java stream api。比方說我們有一個集合,我們想遍歷它並檢查集合中兩個對象的值,並且只有當它們都爲真時,我們纔會返回一個可選的集合。Java 8 flatmap展開集合中的多個對象

return Arrays.stream(someMultiDimensionalArray).flatMap(objectArray -> 
        .filter(MyClass.class::isInstance) 
        .filter(v -> v.value().equals(true)) 
        //need to do something here to do, && (if another value in the collection is true also) 
        .findFirst(); 

/

boolean one = false; 
for(int i=0; i<objectArray.length; i++){ 
    if(!one && objectArray[i].hidden==true) 
    one = true; 

    if(objectArray[i].hidden == true && one) 
    return objectArray[i]; 
} 
+2

另一個值?如果有多個匹配條件的對象會怎樣? – pvg

+0

如果有兩個對象在集合中具有一個真實的字段,則滿足條件 – user2524908

+2

它應該返回什麼?我不知道什麼是可選的填充。你想要返回相同的一對嗎? –

回答

3

所以,你要什麼,如果有是有hidden == true陣列中的超過1個objecst,你想第二個嗎? (從你的代碼的意思)。

所以它只是像stream.filter(o -> o.hidden).skip(1).findFirst()

0

如您在上面留言,當中提到:

如果存在具有收集,然後在條件滿足的真正的現場兩個對象。

你如果在循環語句的代碼片段可以合併爲:

boolean one = false; 
for(int i=0; i<objectArray.length; i++){ 
    if(!one && objectArray[i].hidden) { 
     one = true; 
     return objectArray[i]; 
    } 
} 

事實上,它可以進一步簡化爲:

for(int i=0; i<objectArray.length; i++){ 
    if(objectArray[i].hidden) { 
     return objectArray[i]; 
    } 
} 

然後使用,每個這樣的循環:

for(??? it: objectArray){ 
    if(it.hidden) { 
     return it; 
    } 
} 

然後使用流API是這樣的:

return Arrays.stream(objectArray).filter(it->it.hidden).findFirst(); 

也許你需要投實例&在第一種方法返回flatMap流:整個集合中

return Arrays.stream(someMultiDimensionalArray).flatMap(objectArray -> 
     Arrays.stream(objectArray).filter(it->it.hidden).findFirst() 
            .map(Stream::of).orElse(Stream.empty()) 
) 
.filter(MyClass.class::isInstance) 
.map(MyClass.class::cast) 
.filter(MyClass::value) 
.findFirst();