是否有一种方法可以在以下函数调用的步骤中执行过滤器?
下面的工作很好,但我希望在返回结果对象列表的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::getResults
是null
,预期的行为是什么?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())