逆向 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中文网其他相关文章!