随机播放对象列表 java 流

Shuffle the list of Objects java stream

我有一个单词列表:List<Word> words

bean Word 是:

public class Word {
    private String name;
    private String meaning;
...
}

我想将元素打乱,使其具有以下内容:

发件人:

{ name: "day", meaning: "giorno"},
{ name: "year", meaning: "anno"},
{ name: "hour", meaning: "ora"}

收件人:

{ name: "day", meaning: "ora"},
{ name: "year", meaning: "giorno"},
{ name: "hour", meaning: "anno"}

我已经试过了,但我认为有一个更优雅的解决方案:

private List<Word> shuffle(List<Word> words) {
        List<String> names = words.stream()
                                .map(word -> word.getName())
                                .collect(Collectors.toList());
        List<String> meanings = words.stream()
                                .map(word -> word.getMeaning())
                                .collect(Collectors.toList());
        Collections.shuffle(meanings);

        words = new ArrayList<Word>();
        for(int i = 0; i<names.size(); i++) {
            words.add(new Word(names.get(i), meanings.get(i)));
        }

        return words;
    }

您可以就地洗牌。为此,您不需要创建额外的 Word 对象。

private void shuffle(List<Word> words) {
    List<String> meanings = words.stream()
            .map(Word::getMeaning)
            .collect(Collectors.toList());
    Collections.shuffle(meanings);

    for(int i = 0; i < words.size(); i++) {
        words.get(i).setMeaning(meanings.get(i));
    }
}

没有 zip 并且只有就地洗牌,您的解决方案看起来非常优雅。我只是稍微重构一下:

ArrayList<Word> wordsCopy = new ArrayList<>(this.words);
Collections.shuffle(wordsCopy);
List<Word> result = IntStream.range(0, words.size())
    .mapToObj(i -> new Word(words.get(i).name, wordsCopy.get(i).meaning))
    .collect(Collectors.toList());