代码之家  ›  专栏  ›  技术社区  ›  letthefireflieslive

使用流映射单个对象

  •  3
  • letthefireflieslive  · 技术社区  · 7 年前

    这是java 8流的一个很好的用例吗:

    final Car carWithInterior = Stream.of(carWithEngine)
                .map(car -> installSeats.execute(car))
                .map(car -> installDashBoard.execute(car))
                .map(car -> installSunRoof.execute(car))
                .collect(car);
    

    carWithEngine Car . 请注意,有时即使汽车(带仪表板)通过安装天窗,它也不会做任何事情,因为车顶上没有孔。我应该 总是在最后买辆车 安装/映射过程。

    这个 (这就是为什么我想流式处理它)而且下一个安装有时可能需要pass car实例中的参数来执行它的操作。

    1. 这是Java8流的一个很好的用例吗?

    2. findFirst().get() 会有用的,但我认为那很糟糕,因为我应该在最后得到一辆车,即使安装与 carWitEngine

    我不知道汽车是如何装配的,但假设你需要先装上发动机,然后再加上内饰,这样做是为了类比

    2 回复  |  直到 7 年前
        1
  •  4
  •   shinjw    7 年前

    因为您希望对单个对象执行操作。爪哇8 Optional 会很合适的。

    生成器模式 Car 反对。

    1. 如果 通过一个 .map() 操作。在处理 Streams 强烈建议按预期方式使用这些操作。如果计划从流中删除元素 .filter()

    关于“顺序”和它如何翻译有一些基本的混淆

    可选的

     car => map(execute) => map(execute) => transformedcar
    

    [car1, car2, car3]
         => map(execute) => map(execute) => updatedcar1                |  => findFirst (Optional<Car>)
               => map(execute) => map(execute) =>  updatedcar2         |
                     => map(execute) => map(execute) => updatedcar3    |
                                                                    collect
                                                     [updatedcar1, updatedcar2, updatedcar3]
    

    这个 findFirst 方法将返回 Optional . 这个 collect 方法将提供一个终端操作,允许您聚合/减少/分组这些结果。

    这些 map 操作“顺序”转换传递的元素。但是 Stream 如果你必须处理多辆车或“一系列”车的话,这是合适的。

    重访2

    orElse(car) .

    但这是你必须对你的副作用有争议的地方。

    如果execute方法正在操作并返回传递给它的同一个对象,则会产生意外的结果。我将使用选项,例如,但同样将适用于流。

    private final Car car Optional.of(carWithEngine)
       .map(installSunroof.execute)   // <-- updatedCarWithSunroof
       .map(installDashboard.execute) // <-- updatedCarWithSunroofAndDashboard
       .orElse(carWithEngine)         // <-- updatedCarWithSunroofAndDashboard
    
        2
  •  4
  •   Dani Mesejo    7 年前

    回答你的问题:

    不,Java流Api是用于集合的。从 here 流的定义是:

    操作

    您有一个不是元素序列的对象,因此流的使用使您的代码更难理解。要回答问题2,你可以

    findFirst().orElse(carWithEngine)
    

    示例的另一种选择是简单地嵌套函数调用,如下所示:

    installSunRoof.execute(installDashBoard.execute(installSeats.execute(car)))
    

    另一种方法是在接收BaseIinstaller并返回修改后的car的car上定义一个install方法,如下所示:

    final Car carWithInterior = car.install(installSeats)
                                   .install(installDashBoard)
                                   .install(installSunRoof);