【问题标题】:Add a Method to Java 8 Stream向 Java 8 Stream 添加方法
【发布时间】:2016-01-25 17:48:36
【问题描述】:

在使用 Java 8 Streams 时,我有时会发现 Stream 没有我想要的特定方法(例如 takeWhile()dropWhile()skipLast())。如何在不重写整个 Java 8 Stream 架构的情况下创建自己的具有附加方法的流类?

我知道StreamEx 库并且知道它有takeWhile()dropWhile()。在撰写本文时,它没有skipLast()。我已经为此方法提交了an issue

一个可接受的解决方案是展示如何扩展 Java 8 StreamStreamEx

【问题讨论】:

  • 你应该创建一个包装类并编写你自己的流框架
  • 您可以使用索引创建一个流并使用filter 获取您想要的索引,然后将其映射回实际数据。例如打印除数组中最后一个元素之外的所有内容,IntStream.range(0, array.length).filter(i -> i != array.length-1).mapToObj(i -> array[i]).forEach(System.out::println);。但我认为它不如@LouisWasserman 的建议好。
  • 我们在这里只讨论语法糖。不喜欢静态方法,因为它们是流语法的反模式。但是,如果只是为了一种方法,那么包装所有东西的成本是不可接受的

标签: java java-stream streamex


【解决方案1】:

自 0.5.4 版以来,StreamEx 库具有 chain() 方法。这允许创建方便插入的辅助方法。

public static <T> UnaryOperator<StreamEx<T>> skipLast(int n)
{
   return(stream -> skipLast(stream, n));
}

private static StreamEx<T> skipLast(Stream<T> input, int n)
{
   // implement the real logic of skipLast
}

有了上面的内容,现在可以写...

StreamEx.
   of(input).
   chain(skipLast(10)).
   forEach(System.out::println);

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-08
  • 2016-10-31
相关资源
最近更新 更多