在函数调用中执行筛选



是否有一种方法可以在以下函数调用的步骤中执行过滤器?

下面的工作很好,但我希望在返回结果对象列表的getResults上添加null/empty检查。

我可以尝试.stream()

getResults().stream().filter();但是有点无意义,因为getResults().stream()可能已经抛出空指针了。
这也返回一个Result流。但是我想对List of Result本身做一个检查,比如:

.filter(CollectionUtils::isNotEmpty)

有办法做到这一点吗?

public MyFunc(Helper helper) {
Function<String, HttpEntity<Request>> createRequestFunction = helper::createRequest;
this.fetch = createRequestFunction
.andThen(helper::getResponse)
.andThen(Response::getQuery)
.andThen(QueryResult::getResults)

// I want to make a filter here .filter(CollectionUtils::isNotEmpty) to ensure
// getResults (It is a List<Result> type) is not null or empty 
.andThen(results -> results.stream()
.map(Result::getKey)
.filter(StringUtils::isNotBlank)
.map(s -> s.split("\|"))
.filter(data -> data.length == 2)
.map(data -> data[1])
.collect(Collectors.toList()));
}

createRequestFunction具有Function<String, HttpEntity<Request>>的类型

函数本身没有filter操作。可以通过andThen添加附加功能,也可以通过compose添加前置功能。

如果QueryResult::getResultsnull,预期的行为是什么?this.fetch的值应该是多少?

一个可能的选择是将QueryResult::getResults的结果包装到Optional中。类似这样:

this.fetch = createRequestFunction
.andThen(helper::getResponse)
.andThen(Response::getQuery)
.andThen(QueryResult::getResults)
.andThen(Optinal::ofNullable); 

因此this.fetch的结果是Optinal<List<Result>>,并且可以根据optional是否为空的事实执行不同的逻辑。

return 
this.fetch // Optinal<List<Result>>
.getOrElse(Collections.emptyList()) // value of optional if it is not empty, or empty list otherwise 
.stream()
.map(Result::getKey)
.filter(StringUtils::isNotBlank)
.map(s -> s.split("\|"))
.filter(data -> data.length == 2)
.map(data -> data[1])
.collect(Collectors.toList())

最新更新