2016-08-05 59 views
0

編輯:Java流 - 基於函數的輸出如何篩選正確

基本上我想篩選基於entry.getObject()是否包含值「值」的字符串的所有條目。


所以我有一個代碼塊,看起來是這樣的:

list.stream() 
    .filter((entry) -> entry.getObject() != null) 
    .filter((entry) -> entry.getObject() instanceof String) 
    .filter((entry) -> ((String)entry.getObject()).toLowerCase().contains(value)) 
    .collect(Collectors.toList()); 

的主要問題是,我無法弄清楚如何構建這個堅持entry.getObject的價值(),我不知道如何操作entry.getObject()的輸出而不忽視輸入值的條目。較早嘗試看起來更像是這樣的:

list.stream() 
    .map((entry) -> entry.getObject()) 
    .filter((object) -> entry instanceof String) 
    .map((object) -> (String)entry) 
    .filter((str) -> str.toLowerCase().contains(value)) 
    /* ... */ 

但我想不出任何方式把它與在列表中的我開始了進入。

+0

什麼是入口對應的類? –

+0

如果我正確理解您的需求,您想在相應的條目中反映您對字符串的更改嗎? –

+0

不,基本上我想根據從「條目」獲得的字符串屬性進行過濾,但要確定該屬性,我還需要在各個階段映射和過濾字符串。 – user1125238

回答

-1

你可以做類似

list.stream() 
    .map((e) -> new Entry(e, e.getObject())) 
    .filter((p) -> p.getValue() instanceof String) 
    //... 
    .map((p) -> p.getKey()) 
    .collect(Collectors.toList()); 

使用的Map.Entry或swing.Pair(或推出自己的元組狀結構)

0

一個可能的解決方案是這樣的:

list.stream() 
    .filter((entry) -> Arrays.stream(new Entry[] {entry}) 

     // Map from entry to entry.getObject() 
     .map((entry) -> entry.getObject()) 

     // Remove any objects that aren't strings 

     .filter((object) -> entry instanceof String) 

     // Map the object to a string 
     .map((object) -> (String)entry) 

     // Remove any strings that don't contain the value 
     .filter((str) -> str.toLowerCase().contains(value)) 

     // If there is a product remaining, then entry is what I want 
     .count() > 0) 

    .collect(Collectors.toList()); 

這樣,我們可以拆分並分析entry.getObject()而不用多次調用,以在每一步獲取值。

+1

使用Arrays.stream()傳輸數組而不構建中間列表 – Pausbrak

+0

@Pausbrak會做!編輯英寸 – user1125238

+0

如果您想要單個元素流,則甚至不需要數組。你可以使用'Stream.of(entry)'。另一方面,您甚至在這裏甚至不需要Stream。你可以使用'Optional.of(entry)',將'map'和'filter'操作鏈接成一個流,而不是'.count()> 0'使用'.isPresent()'。 – Holger