Java 8 流API:用流替换每个循环(内部包含昂贵的操作调用)

Java 8 流API:用流替换每个循环(内部包含昂贵的操作调用),java-8,java-stream,Java 8,Java Stream,我目前正在努力提高我的Java8技能,偶然发现了这个案例。 我的目标是用方法fooStream中的一些Java8流替换方法foo中现有的循环 问题是,我在循环中调用了一个非常昂贵的操作,并希望在调用的结果满足我的期望时退出它。我的流实现现在总是比我的老式循环实现多进入一次极其昂贵的操作(在map调用中) 我的流实现是否可以改进以防止此额外调用 public class Foo { public static void main(final String[] args) { final

我目前正在努力提高我的Java8技能,偶然发现了这个案例。 我的目标是用方法
fooStream
中的一些Java8流替换方法
foo
中现有的循环

问题是,我在循环中调用了一个非常昂贵的操作,并希望在调用的结果满足我的期望时退出它。我的流实现现在总是比我的老式循环实现多进入一次极其昂贵的操作(在map调用中)

我的流实现是否可以改进以防止此额外调用

public class Foo {
  public static void main(final String[] args) {
    final List<String> someList = Arrays.asList(null, null, "xxx", null, null, "foo");
    foo(someList);
    fooStream(someList);
  }

  public static String foo(final List<String> someList) {
    for (final String foo : someList) {
      final String result = extremelyExpensiveOperation(foo, "loop");
      if (result != null) {
        return result;
      }
    }

    return null;
  }

  public static String fooStream(final List<String> someList) {
    return someList //
        .stream() //
        .filter(p -> extremelyExpensiveOperation(p, "streamFilter") != null) //
        .map(p -> extremelyExpensiveOperation(p, "streamMap")) //
        .findFirst().orElse(null);
  }

  private static String extremelyExpensiveOperation(final String foo, final String operation) {
    System.out.println("entered extremelyExpensiveOperation: " + operation);
    // do some extremely expensive operation
    // but in our show and tell case just return foo
    return foo;
  }

}
公共类Foo{
公共静态void main(最终字符串[]args){
final List someList=Arrays.asList(null,null,“xxx”,null,null,“foo”);
foo(someList);
fooStream(someList);
}
公共静态字符串foo(最终列表someList){
for(最终字符串foo:someList){
最终字符串结果=极端昂贵的操作(foo,“循环”);
如果(结果!=null){
返回结果;
}
}
返回null;
}
公共静态字符串fooStream(最终列表someList){
返回某人列表//
.stream()//
.filter(p->extremelyExpensiveOperation(p,“流过滤器”)!=null)//
.map(p->extremelyExpensiveOperation(p,“streamMap”))//
.findFirst().orElse(null);
}
私有静态字符串extremelyExpensiveOperation(最终字符串foo,最终字符串操作){
System.out.println(“输入的极端昂贵操作:+操作”);
//做一些非常昂贵的手术
//但在我们的展示和讲述案例中,只需返回foo即可
返回foo;
}
}

这应该相当简单:

return someList //
            .stream() //
            .map(p -> extremelyExpensiveOperation(p, "streamFilter"))
            .filter(Objects::nonNull)
            .findFirst()
            .orElse(null);

一个问题:
!=空
检查您正在做的是将空值排除到
someList
中,或者您也需要对空值调用
extremelexpensiveoperation
?此
列表
(作为整个示例)仅用于显示和告知。必须始终调用
extremelyExpensiveOperation
。好的,我已经删除了我的答案。。。我认为旧的for循环对于您的情况来说更有效!