我想知道什么更快:按字段过滤自定义对象,然后按其字段映射,反之亦然(先映射,然后过滤)。
最后,我通常希望将映射的字段收集到一些Collection中。

例如,最简单的Person类:

public class Person {
    String uuid;
    String name;
    String secondName;
}

现在让我们有一个List<Person> persons
List<String> filtered1 = persons
                .stream()
                .filter(p -> "NEED_TOY".equals(p.getName()))
                .map(Person::getName)
                .collect(Collectors.toList());
// or?
List<String> filtered2 = persons
                .stream()
                .map(Person::getName)
                .filter(p -> "NEED_TOY".equals(p))
                .collect(Collectors.toList());

最佳答案

在这个特定示例中,调用Person.getName()基本上完全没有花费,这没关系,您应该使用最易读的内容(并且过滤可能甚至快一些,因为正如TJ所述,映射操作是过滤操作的一部分)。

但是,如果映射操作的成本很高,则首先过滤(如果可能)会更有效率,因为流不必映射已过滤出的元素。

让我们举一个人为的示例:您有一个ID流,并且对于流中的每个偶数ID,您都必须执行http GET请求或数据库查询以获取由该ID标识的商品的详细信息(并因此映射详细对象的ID)。

假设流由一半的偶数ID和一半的奇数ID组成,并且每个请求花费相同的时间,则可以通过首先过滤将时间除以2。如果每个http请求都花费1秒,并且您有60个ID,则通过先进行过滤,对于同一任务,您将从60秒缩短到30秒,还可以减少网络和外部http API的费用。

10-07 13:06
查看更多