【问题标题】:Is it good practice to execute multiple task in single map在单个地图中执行多个任务是一种好习惯吗
【发布时间】:2020-06-27 20:19:42
【问题描述】:

我是响应式编程的新手,我正在寻找在单个映射中执行多个任务的好习惯,或者我应该为每个单个操作创建单独的映射。

方法一

Mono.just(new Hashmap())
.map(m -> {m.put("One"); return m;})
.map(m -> {m.put("Two"); return m;})
.map(m -> {m.put("Three"); return m;})

方法二

Mono.just(new Hashmap())
.map(m -> {
  m.put("One");
  m.put("Two");
  m.put("Three");
  return m;
})

那么哪一个是最佳实践,特别是对性能的影响?

让我更清楚地定义它。我想知道在一个地图中输入多个目的代码的好习惯,或者我应该为每个目的创建地图,就像我有一个用户对象现在我想更新它的十个字段可能我二十个。

所以如果我使用单个地图,我的代码如下所示。

Mono.just(new User())
.map(user -> {
user.setFirstName("abc");
user.setMiddleName("abc");
user.setLastName("abc");
user.setEmail("abc");
user.setAddress("abc");
// setting twenty more fields.
return user;
});

或者我应该像这样在单独的地图中完成每个任务

Mono.just(new User())
.map(user-> {user.setFirstName("abc"); return user;})
.map(user-> {user.setMiddleName("abc"); return user;})
.map(user-> {user.setLastName("abc"); return user;})
//twenty more map function called to set each property

最佳做法是什么?

【问题讨论】:

  • 我不太了解您对map 的用法,我通常会使用它来将现有类型T 映射到R,但不会修改现有实例。在这种情况下,我只需用所有值预填充 Map 并返回其中的 Mono.just。
  • 也许您可以为您的问题添加更多说明。
  • 我已经更新了我的问题,请看一下
  • 为什么你认为反应式编程在这里会有所帮助?填充地图的好习惯是直接填充,完全不使用反应式编程。

标签: java spring reactive-programming spring-webflux project-reactor


【解决方案1】:

那么哪一个是最佳实践,特别是对性能的影响?

性能在实践中几乎没有区别,因为 reactor 内置了可融合优化,这意味着您的多个地图调用在实践中被融合到一个运算符中。

恕我直言,因此重点应该放在最最清晰要阅读的方法上 - 在这种情况下(再次,至少对我而言),它是仅使用一个地图调用的方法。

然而,另一个更大的建议是尽可能在整个链中使用 不可变 对象,而不是直接通过 map 调用来改变链中的对象。这并不是 map 调用的真正用途,并且出于多种原因,以这种方式改变对象是不可取的。对于 POJO,您可能希望使用类似 lombok 的 @With 之类的东西,例如:

Mono.just(new User())
.map(user -> 
    user.withFirstName("abc")
        .withMiddleName("abc")
        .withLastName("abc")
        .withEmail("abc")
        .withAddress("abc")
);

虽然在这个人为的示例中它没有功能上的差异,但它更易于阅读,并且“正确”使用映射(映射到新值而不是改变现有值。)在实际使用中,它也是更不容易出错,因此更容易推断反应链的状态。

【讨论】:

  • 感谢您的回答。但是没看懂你说的。你能更详细地定义一下吗
  • @MuhammadIlyas 哪一部分你不明白,你想更清楚/详细说明哪一点?
  • 如果你能举个例子用正确的方法做某事
  • @MuhammadIlyas 抱歉,仍然不清楚您在这里的目的是什么 - 您想要一个带有不可变对象的示例,一个带有单个 map 调用的示例,还是两者兼而有之?
  • 是的,如果可能的话,您可以用最佳方法分享示例
猜你喜欢
  • 2015-01-08
  • 1970-01-01
  • 1970-01-01
  • 2019-11-07
  • 1970-01-01
  • 2014-01-06
  • 2016-12-22
  • 1970-01-01
  • 2016-01-03
相关资源
最近更新 更多