我有一个简单的流如下:
List<Long> r = l.stream()
.filter(a->a.getB() % 2 == 0)
.map(A::getB)
.collect(Collectors.toList());
但Intellij建议我:
“filter()”和“map()”可以互换。检查信息:报告流API调用链可以简化。它允许在遍历集合时避免创建冗余的临时对象。例如
Intellij给出的例子很容易理解,但我不明白为什么它建议我使用map()。过滤器()
。
我查看了ReferencePipeline
的来源,但没有找到任何线索:map()。filter()
或filter()。map()
对于与流实现相关的临时对象(filter())没有影响。如果
的自动装箱功能就会减少)。A.b
是一个让我更困惑的原语,map()
那么,我是否错过了一些流点实现,或者这是Intellij的错误警报?
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(特别是在对同一子类型进行多次不同计算时)