gpt4 book ai didi

java - 如何限制 Flux> 中的元素数量并将其映射到自定义结果

转载 作者:行者123 更新时间:2023-12-02 08:55:50 25 4
gpt4 key购买 nike

假设我有一些类(class)来说明歌曲和投票的问题。

用户.java

@EqualsAndHashCode
@Setter
@AllArgsConstructor
@NoArgsConstructor
@Builder
@Document(collection = "users")
public class User {

@Id private String id;

private String username;

private String email;

private Integer age;

private String password;

@DBRef(db = "interview", lazy = true)
@EqualsAndHashCode.Exclude
@ToString.Exclude
private Set<Song> songs;
}

歌曲.java

@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class Song {

@Id private String id;

private String title;

private String author;

private SongGenre songGenre;

Set<Vote> votesOfSong;
}

投票.java

@Builder
@AllArgsConstructor
@NoArgsConstructor
@Document(collection = "votes")
@Getter
public class Vote {

@Id private String id;

private User user;

private Song song;

private VoteKind voteKind;

@Default private LocalDateTime dateOfVote = LocalDateTime.now();
}

VoteKind.java

@RequiredArgsConstructor
@Getter
public enum VoteKind {
LIKE(1),
DISLIKE(-1);

private final Integer voteValue;
}

我想创建一个方法,它将返回最常见的 SongGenreSongTitle 以及特定歌曲的投票数。

到目前为止,我有这样的方法:

public Flux<Map<Song, SongGenre>> theMostCommonSongForSongGenre(SongGenre songGenre) {
voteRepository
.findAll()
.collect(
Collectors.toMap(vote -> vote.getSong().getSongGenre(), this::getSumOfVotesForVote))
.map(Map::entrySet)
.flatMapMany(Flux::fromIterable)
.filter(stringListEntry -> stringListEntry.getKey().equals(songGenre))
.sort(Map.Entry.comparingByKey(Comparator.reverseOrder()))
.collect(Collectors.toMap(o -> o.getKey(), o -> o.getValue()));
}

和辅助方法:

  private int getSumOfVotesForSong(Vote vote) {
return vote.getSong().getVotesOfSong().stream()
.mapToInt(voteKind -> vote.getVoteKind().getVoteValue())
.sum();
}

这里有两个问题我无法完全解决。

  1. 如何将 Flux 的结果限制为例如 1 或 10 条记录。按照传统方式,在 Java Stream API 中,我可以使用方法 findFirstlimit 但这里没有其他等效方法。我唯一可以调用的方法是 limitRate,但它有另一个宿命。

  2. 如何转换当前解决方案以返回特定歌曲的 SongGenreSongTitle 和票数。是否有机会返回上述参数的 MultiMap,或者我应该使用 groupingBy 并返回一个以 songGenresongTitle 作为键和值的自定义对象相当于票数的整数。

编辑:核心 java 流解决方案可能是理想的。

对于如何实现目标的建议,我将不胜感激。

最佳答案

如果您使用响应式,您通常希望避免像collect()这样的事情,因为它是阻塞的。您可以在通量上调用collectList()来获取该列表的单声道。

Flux 有一个 take() 方法来限制结果。

关于java - 如何限制 Flux<Map<K,V>> 中的元素数量并将其映射到自定义结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60488654/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com