使用 Java 8 Streams API 随机排列整数列表

2022-09-01 04:48:48

我试图使用Streams API将Scala的以下行转换为Java 8:

// Scala
util.Random.shuffle((1 to 24).toList)

为了在Java中编写等效项,我创建了一系列整数:

IntStream.range(1, 25)

我怀疑在流API中找到一个方法,但只知道奇怪的方法:toListIntStream

collect(
  Supplier<R> supplier, ObjIntConsumer<R> accumulator, BiConsumer<R,R> combiner)

如何使用 Java 8 Streams API 对列表进行随机排序?


答案 1

给你:

List<Integer> integers =
    IntStream.range(1, 10)                      // <-- creates a stream of ints
        .boxed()                                // <-- converts them to Integers
        .collect(Collectors.toList());          // <-- collects the values to a list

Collections.shuffle(integers);

System.out.println(integers);

指纹:

[8, 1, 5, 3, 4, 2, 6, 9, 7]

答案 2

您可能会发现以下方法很有用。toShuffledList()

private static final Collector<?, ?, ?> SHUFFLER = Collectors.collectingAndThen(
        Collectors.toCollection(ArrayList::new),
        list -> {
            Collections.shuffle(list);
            return list;
        }
);

@SuppressWarnings("unchecked")
public static <T> Collector<T, ?, List<T>> toShuffledList() {
    return (Collector<T, ?, List<T>>) SHUFFLER;
}

这实现了以下类型的单行:

IntStream.rangeClosed('A', 'Z')
         .mapToObj(a -> (char) a)
         .collect(toShuffledList())
         .forEach(System.out::print);

输出示例:

AVBFYXIMUDENOTHCRJKWGQZSPL

推荐