2017-03-08 64 views
1

在其中一種方法中,我們使用了lambda表達式(下面)的嵌套流。方法ref來自lambda

return req.gUs().stream() 
.map((**cfg) -> { 
.filter(Optional::isPresent) 
.map(Optional::get); 

我想使用一些輔助方法和方法參考(下面)來移動部分代碼。

(cfg) -> { 
return rsp.getUs().stream() 
.filter(result.getId())  
.map((result) -> gEvent(index, Builder, cfg)); 

任何建議,非常感謝。

+0

看的簽名'Stream.map()'並從那裏開始。 – Jeremy

+0

除了嵌套lambdas(你的cfg - > {}方法應該真的被移動到它自己的方法),該方法對我來說很好。 –

+0

你需要的是['Function'](https://docs.oracle.com/javase/8/docs/api/java/util/function/Function.html) – KarelG

回答

1

你可以做一個方法,返回一個功能:

return req.getUs().stream() 
.map(myFunction(rsp, index, headerBuilder)) 
.flatMap(stream -> stream) 
.filter(Optional::isPresent) 
.map(Optional::get); 

private Function<CFGType, GenerateReturnType> myFunction(RspType rsp, IndexType index, HeaderType header){ 
    return (cfg) -> { 
    return rsp.getPerUs().stream() 
    .filter((result) -> cfg.getId() == result.getId()) 
    .filter((result) -> result.getCode() == ResultCode.SUCCESS) 
    .map((result) -> generateEvent(index, headerBuilder, cfg)); 
    } 
} 

或者你可以使用的方法引用如果RSP,指數和標頭是字段:

return req.getUs().stream() 
.map(this::myFunction) 
.flatMap(stream -> stream) 
.filter(Optional::isPresent) 
.map(Optional::get); 

private GenerateType myFunction(CFGType cfg) { 
    return rsp.getUs().stream() 
    .filter((result) -> cfg.getUsChId() == result.getChId()) 
    .filter((result) -> result.getResultCode() == ResultCode.SUCCESS) 
    .map((result) -> generateEvent(index, headerBuilder, cfg)); 
} 
+0

好吧,我在myFunction簽名中犯了一個錯字。應該是myFunction(CFGType cfg)。 –

+0

我假設,rsp是該類中的一個字段。 –

+0

CFGType,RspType和GenerateRemoveEventReturnType只是在類的其餘部分寫入的類型的佔位符。 –