Java8流API函数

Java8流API函数,java,if-statement,java-8,functional-programming,java-stream,Java,If Statement,Java 8,Functional Programming,Java Stream,我不熟悉Java8StreamsAPI。我使用的是forEach和filter,注意到下面的代码段可以用其中一个进行修改,以产生相同的结果。在这种情况下,两者有什么不同,以及如何决定何时使用哪一种 items.forEach(item -> { if (item.contains("B") { System.out.println(item); } }); 它们具有相同的效果 不同之处在于调用filter的代码段使用流的过滤操作,而带有if语句的forEa

我不熟悉Java8StreamsAPI。我使用的是
forEach
filter
,注意到下面的代码段可以用其中一个进行修改,以产生相同的结果。在这种情况下,两者有什么不同,以及如何决定何时使用哪一种

items.forEach(item -> {
    if (item.contains("B") {
        System.out.println(item);
    }
});

它们具有相同的效果

不同之处在于调用
filter
的代码段使用流的过滤操作,而带有
if
语句的
forEach
使用普通的
if
语句

使用哪一种取决于您想要应用的样式,但是函数式编程范式,即后一段代码的样式,最近变得越来越流行


我个人会用

items
    .filter(item -> item.contains("B"))
    .forEach(System.out::println);

我发现这更具可读性。

除了可读性之外:对于第二个版本,这两个调用可以并行化,特别是当过滤器和输出都需要一些时间时

想象一下,过滤器用一个需要5秒钟的调用检查数据库,而不是打印到控制台,而是将一些东西上传到服务器,这也需要5秒钟

在您的第一个版本中,流管道需要在
forEach
调用中花费10秒钟(显然,如果发生输出)


在第二个版本中,在一个元素通过过滤器调用后,可以过滤另一个元素,同时输出第一个元素;这意味着整个过程只需15秒,而不是本例中的20秒。

语法不同,但结果相同:)!forEach(…)语法很清楚。筛选器语法被lambda item->item.contains(“B”)隐藏。 如果没有lambda,.filter将以“谓词”的实例为例:

public Class MyPredicate<String> implements Predicate {
  @Override
  public boolean test(String myString) {
    return myString.contains("B");
  }
}
公共类MyPredicate实现谓词{
@凌驾
公共布尔测试(字符串myString){
返回myString.contains(“B”);
}
}

您可以这样使用-.filter(new MyPredicate())。

您不应该这样写:至少,写
返回myString.contains(“B”)
forEach
不能保证执行顺序,则使用code>而不是无用的
if/else
forEach
,因此选择的方法不会影响此处的性能。如果使用了
forEachOrdered
,我想它确实会有所不同。@DidierL
forEach
不需要保证执行顺序就可以产生不同。但它可能只在并行流中执行。我的意思是在并行上下文中:
forEachOrdered
不能并行处理,因为它强制执行顺序。在这种情况下,一个单独的
过滤器()
可能允许一些并行性。但是,使用一个简单的
forEach
,一切都可以并行,因此无论您是否使用单独的
过滤器()
public Class MyPredicate<String> implements Predicate {
  @Override
  public boolean test(String myString) {
    return myString.contains("B");
  }
}