首页  >  文章  >  Java  >  如何高效地反转 Java 8 流?

如何高效地反转 Java 8 流?

Barbara Streisand
Barbara Streisand原创
2024-10-30 05:57:03372浏览

How to Reverse a Java 8 Stream Efficiently?

逆向 Java 8 流

在 Java 8 中,流提供了一种强大而简洁的方式来操作和处理数据。一种常见的操作是反转流。本文探讨了实现此目的的两种方法:用于反转 IntStream 的特定解决方案和用于反转任何对象流的通用方法。

特定 IntStream 反转

反转IntStream,可以创建一个自定义方法来以相反的顺序映射值的范围。例如,如果我们有一个范围从 -5 到 0 的 IntStream,则反转它会导致流从 0 到 -5。这可以使用以下代码来实现:

static IntStream revRange(int from, int to) {
    return IntStream.range(from, to)
                    .map(i -> to - i + from - 1);
}

此方法避免装箱和排序,从而产生更高效的解决方案。

通用流反转

对于反转任何对象类型的流,可以使用两种方法。第一种是将流元素存储在数组中并以相反的顺序读出它们:

@SuppressWarnings("unchecked")
static <T> Stream<T> reverse(Stream<T> input) {
    Object[] temp = input.toArray();
    return (Stream<T>) IntStream.range(0, temp.length)
                                .mapToObj(i -> temp[temp.length - i - 1]);
}

这种方法很简单,但需要创建一个中间数组。

另一种技术是使用收集器将项目累积到反向列表中:

Stream<T> input = ... ;
List<T> output =
    input.collect(ArrayList::new,
                  (list, e) -> list.add(0, e),
                  (list1, list2) -> list1.addAll(0, list2));

此选项还需要存储流元素,但它消除了使用前面插入的 ArrayList 进行复制的需要。

值得注意的是,没有“正确”的方法可以在不存储元素的情况下反转流。然而,所提出的方法为特定的 IntStream 反转和通用流反转提供了高效且通用的解决方案。

以上是如何高效地反转 Java 8 流?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn