【问题标题】:Java Stream: changing the value of a property without calling a functionJava Stream:在不调用函数的情况下更改属性的值
【发布时间】:2019-02-09 21:49:42
【问题描述】:

我想知道是否可以在不调用函数的情况下更改属性的值,例如:

return findAll().stream()       
                .map(cps -> cps.setFavorited(true))
                .distinct()
                .collect(toList());

【问题讨论】:

  • 很抱歉,您的示例对我来说不是很清楚。你能澄清一下你想做什么吗?
  • 除非setFavorited 返回this,否则甚至无法编译...
  • 另一方面,setter 也是函数。这就是为什么 Eugene 指出的正确,因为在您的情况下,setter 的返回类型很重要(不再是 void)。不调用函数是什么意思?
  • 一般情况下,您不应该以任何方式修改流中的任何对象。

标签: java java-8 functional-programming java-stream


【解决方案1】:

如果我理解正确,您的流式解决方案将类似于:

return findAll().stream()       
                .map(cps -> {cps.setFavorited(true); return cps;})
                .distinct()
                .collect(toList());

或者你的setFavorited 可以返回this,从而允许链接:

 public <Whatever> setFavorited(boolean flag){
     this.favorited = flag;
     return this;
 }

但是你必须对这类事情非常小心,因为你只关心distinct(这依赖于至少equals)。流实现可能会检测到您的equals 可能基于favorited 之外的一些其他属性,因此它可能至少在理论上完全跳过map。这可能有点牵强,但在java-9 中,例如,这是一种优化:

Stream.of(1,2,3)
      .map(x -> x + 1)
      .count();

由于您只关心count,因此跳过了map

【讨论】:

    猜你喜欢
    • 2020-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-20
    • 1970-01-01
    • 2023-04-06
    • 2018-05-09
    相关资源
    最近更新 更多