我正在尝试流式处理字符串列表。我知道我们可以像下面这样:
list.stream().filter(i -> !Stringutils.isempty(service.someMethod(i))).map(i -> service.someMethod(i)).findfirst().get();
问题是我需要打两次service.someMethod
。
这里有什么建议可以避免service.someMethod
在过滤器中调用两次,而在映射中调用另一个?
答案 0 :(得分:4)
您应该这样反转地图和过滤器:
list.stream()
.map(service::someMethod)
.filter(s -> !Stringutils.isEmpty(s)) // or if it exists, StringUtils::isNotEmpty
.findFirst()
.get()
答案 1 :(得分:1)
我喜欢使用java8流,希望您也这样做。
似乎您想使用someMethod
映射列表,然后过滤非空值,所以只需执行此操作即可!
您唯一要做的就是更改地图和过滤器的顺序。
更改订单后,someMethod将仅被调用一次,因为我们将它们映射一次并过滤映射的值。
新代码将如下所示:
String answer = list
.stream()
.map(a -> service.someMethod(a))
.filter(a -> !a.isEmpty())
.findFirst()
.get();
更好的是,您可以将lambda替换为方法引用
.map(service::someMethod)
// same as .map(a -> service.someMethod(a))
(对不起,我的英语)