Reputation: 165
lets say that I have a repository like below:
import io.vavr.collection.HashMap;
import io.vavr.collection.List;
import io.vavr.collection.Map;
import io.vavr.control.Option;
import org.springframework.stereotype.Repository;
import reactor.core.publisher.Mono;
@Repository
class ImageSizeRepositoryInMemoryImpl implements ImageSizeRepository {
private volatile Map<String, ImageSize> imageSizes = HashMap.empty();
@Override
public Mono<ImageSize> save(Mono<ImageSize> imageSize) {
return imageSize.map(i -> {
imageSizes.put(i.getName(), i);
return i;
});
}
@Override
public Mono<Void> deleteByName(String name) {
this.imageSizes = imageSizes.remove(name);
return Mono.empty();
}
@Override
public Option<ImageSize> findOneByName(String name) {
return imageSizes.filter(t -> t._1.equals(name))
.map(t -> t._2)
.headOption();
}
@Override
public List<ImageSize> findAll() {
return imageSizes.values().toList();
}
}
As we can see there is save method that takes imageSize argument as Mono... So if want to be reactive, in this method I should avoid any blocking operation... So my question is: Is map operator the right place to write (imageSizes.put(i.getName(), i))?
Upvotes: 1
Views: 1368
Reputation: 12932
Map
should be side effects free. Side effect like storing it in hash map should be done in doXXX
methods - in your case doOnNext
Upvotes: 2