使用流从列表中保存字符串

时间:2020-07-01 18:46:44

标签: java java-8 java-stream

我正在尝试流式处理字符串列表。我知道我们可以像下面这样:

list.stream().filter(i -> !Stringutils.isempty(service.someMethod(i))).map(i -> service.someMethod(i)).findfirst().get();

问题是我需要打两次service.someMethod

这里有什么建议可以避免service.someMethod在过滤器中调用两次,而在映射中调用另一个?

2 个答案:

答案 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))

(对不起,我的英语)