当前位置: 首页 > 知识库问答 >
问题:

“filter()”和“map()”可以互换

包建义
2023-03-14

我有一个简单的流如下:

List<Long> r = l.stream()
                .filter(a->a.getB() % 2 == 0)
                .map(A::getB)
                .collect(Collectors.toList());

但Intellij建议我:

“filter()”和“map()”可以互换。检查信息:报告流API调用链可以简化。它允许在遍历集合时避免创建冗余的临时对象。例如

  • collection.stream()→collection.for每个()
  • collection.stream()。

Intellij给出的例子很容易理解,但我不明白为什么它建议我使用map()。过滤器()

我查看了ReferencePipeline的来源,但没有找到任何线索:map()。filter()filter()。map()对于与流实现相关的临时对象(filter())没有影响。如果A.b是一个让我更困惑的原语,map()的自动装箱功能就会减少)。

那么,我是否错过了一些流点实现,或者这是Intellij的错误警报?

共有1个答案

盖昊东
2023-03-14

a.getB()被调用两次——一次在过滤器内部,它也是映射函数,因此与其这样做两次,不如先使用getB映射它,然后过滤掉它

<代码>列表

编辑

如果getB返回long,则可以使用mapToLong来避免中间装箱操作。

List<Long> r = l.stream()
                .mapToLong(A::getB)
                .filter(b->b % 2 == 0)
                .boxed()
                .collect(Collectors.toList());

样本输出

使用静态计数器计算get方法的调用次数:

class A {
    public static int count = 0;
    private long b;

    public long getB() {
        count++;
        return b;
    }
}
List<A> list= List.of(new A(1L), new A(3L), new A(4L));
list.stream() 
    .filter(a -> a.getB()%2 == 0)
    .map(A::getB)
    .collect(Collectors.toList());
System.out.println(A.count); // returns 4

然而

list.stream()
    .mapToLong(A::getB)
    .filter(b->b % 2 == 0)
    .boxed()
    .collect(Collectors.toList());
System.out.println(A.count); // returns 3
 类似资料:
  • 我从对象和对象数组中更改了一个对象两次,这样在第一次迭代中,我过滤掉了几个对象,在第二次迭代中,我使用map更改了每个过滤后的对象。我能用减速机或更好的吗?

  • 以下是我在URL中读到的优势:有角度的承诺和可观察的 承诺: 返回单个值 未取消 包含try/catch和async/await的更多可读代码 可观测的 随时间使用多个值 可取消 支持map、filter、reduce和类似运算符 使用反应扩展(rxj) 项随时间异步到达的数组 在observable中,我看到3&4点支持操作符和RXJ。我只是有一个基本的问题,比如我不能使用RXJS和有承诺的操作

  • ,和在Python 2中完美工作。这里有一个例子: 但是在Python 3中,我收到以下输出: 如果有人能向我解释这是为什么,我将不胜感激。 为进一步清晰起见,代码截图:

  • 对于Java流,有没有理由使用而不是和的组合? 例如使用: 或

  • map/reduce/filter 是 Python 中较为常用的内建高阶函数,它们为函数式编程提供了不少便利。 map map 函数的使用形式如下: map(function, sequence) 解释:对 sequence 中的 item 依次执行 function(item),并将结果组成一个 List 返回,也就是: [function(item1), function(item2), f

  • 我有一组从共享类型继承的域对象(即、)。子类型具有特定的属性(即、)。 此外,作为解析日志文件的结果,我有一个包含混合子类型的记录列表。 为了计算日志记录上的统计信息,我想只在匹配特定子类型的记录子集上应用数学函数,即只在s上应用数学函数。因此,我希望有一个特定子类型的过滤流。我知道可以使用以下方法将和应用到子类型 在流上多次应用这个filter&cast(特别是在对同一子类型进行多次不同计算时)