Java 在单个映射中执行多个任务是否是一种良好的做法

Java 在单个映射中执行多个任务是否是一种良好的做法,java,spring,reactive-programming,spring-webflux,project-reactor,Java,Spring,Reactive Programming,Spring Webflux,Project Reactor,我是反应式编程新手,我正在寻找的是在单个映射中执行多个任务的良好实践,或者我应该为每个操作创建单独的映射 方法1 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;}) 方法2 Mono.just(n

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

方法1

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;})
方法2

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
哪一个是最佳实践

那么,哪一个是最佳实践,对性能有什么影响

性能在实践中并没有什么不同,因为reactor内置了可融合的优化,这意味着您的多个map调用在实践中被融合到一个操作符中

因此,IMHO,重点应该放在最清晰易读的方法上——在这种情况下(至少对我来说是这样),这是一种只使用一个map调用的方法

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

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

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

我不太理解您对
map
的用法,我通常使用它将现有类型
t
映射到
R
,但不修改现有实例。在这种情况下,我只需在
Map
中预先填充所有值,然后返回一个
Mono。只需
。也许您可以对您的问题进行补充说明。我已经更新了我的问题,请看一看,为什么您认为反应式编程可能会在这里有所帮助?填充地图的好方法是直接填充地图,根本不使用反应式编程。谢谢回答。但是我不明白你说的话。你能更详细地说明一下吗detail@MuhammadIlyas你不明白哪一部分,你想更清楚/详细地说明哪一点?比如,如果你能提供一个适当的例子来做某事approach@MuhammadIlyas抱歉,仍然不清楚您在这里想要什么-您想要一个具有不可变对象的示例,一个具有单个映射调用的示例,或者两者都有?是的,如果可能的话,您可以与best approach分享示例