我正在嘗試實作一些簡單的 Spring Boot GraphQL BatchMapping。
@BatchMapping接收 a然后List<Book>呼叫 a@Repository并將結果轉換為 a Map<Book, Author>。我正在努力使用 ReactorFlux和Mono.
@BatchMapping
Mono<Map<Book, Author>> author(List<Book> books) {
List<String> authorIds = books.stream().map(book -> book.authorId).toList();
Flux<Author> authors = authorRepository.findAllById(authorIds);
return authors.mapToTheBooksInTheCorrectOrder???();
}
每個Book都有一個Author,但多個Books 可以有相同的Author。
我想回傳 a Map(更準確地說是 a Mono<Map>),其中 key 是eachBook而 value 是對應的Author。
您可以假設(由 回傳)Author內的 s是唯一的,并且回傳的 s 與from具有相同的順序(第一次出現):Flux<Author>authorRepository.findAllByIdAuthorauthorIdList<Book>
book1 = { id: "1", name: "A Scanner Darkly", authorId = "2" }
book2 = { id: "2", name: "High Fidelity", authorId = "1" }
book3 = { id: "3", name: "The Man In The High Castle", authorId = "2" }
將導致:
authors = [
{ id: "2", name: "Philip K. Dick" }
{ id: "1", name: "Nick Hornby" }
]
換句話說:
- 為每個條目
List<Book>創建一個鍵Map - 然后從
Flux<Author>
該方法的結果應該是(對于這個例子):
{
book1 : author2,
book2 : author1,
book3 : author2
}
全部包裹在一個Mono<Map>.
uj5u.com熱心網友回復:
如果您在使用Fluxand時遇到困難Mono,可以使用collectList()運算子來獲取List<Author>. 例如:
return authorRepository
.findAllById(authorIds)
.collectList() // Mono<List<Author>>
.map(authors -> /* Use authors books to get a Map<Book, Author> */);
這樣做的好處是您可以使用map()運算子并使用List<Author>and List<Book>,這是您可能更熟悉的型別。
就個人而言,我什至建議使用collectMap()運算子并創建一個Map以作者的 ID 作為鍵和Author作為Map. 這使得檢索Author每個物件的相關物件變得更加容易Book,因為這樣您就可以使用authorIdMap.get(book.getAuthorId()). 例如:
return authorRepository
.findAllById(authorIds)
.collectMap(Author::getId) // Mono<Map<String, Author>>
.map(authorIdMap -> /* Use authorIdMap books to get a Map<Book, Author> */);
在這種情況下,authorIdMap將是一個Map<String, Author>.
如果您不想在map()函式中使用常規的 for-loop/streams,您也可以使用回應式流。為此,您首先需要制作一個Flux<Book>,然后您可以再次使用collectMap()運算子,但這次鍵將是Book物件,值將是相應的Author物件。
return authorRepository
.findAllById(authorIds)
.collectMap(Author::getId) // Mono<Map<String, Author>>
.flatMap(authorIdMap -> Flux
.fromIterable(books) // Flux<Book>
.collectMap(identity(), book -> authorIdMap.get(book.getAuthorId()))); // Mono<Map<Book, Author>>
在這種情況下,您需要使用flatMap()in 代替,map()因為該函式將回傳反應流而不是普通物件。
此外,要將當前物件用作collectMap()運算子中的鍵,您可以撰寫collectMap(book -> book, ...). 但是,撰寫這些x -> xlambda 運算式的一種更簡潔的方法是使用Function.identity()(或者identity()如果您使用靜態匯入)。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/485711.html
標籤:爪哇 春天 弹簧靴 反应堆 spring-graphql
