方法ref来自lambda

时间:2017-03-08 07:02:09

标签: java lambda

在其中一个方法中,我们使用了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));

非常感谢任何建议。

1 个答案:

答案 0 :(得分:1)

您可以创建一个返回Function:

的方法
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,index和header是字段,则可以使用方法引用:

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));
}