Java在抽象数据类型上使用流?

时间:2015-12-24 02:47:50

标签: java java-8 java-stream

我无法完全理解流如何在Java中工作。你可以像MyArrayList那样制作一个抽象的数据类型,并以某种方式使用流吗?

类似的东西:

MyDataType<MyClass> myList = new MyDataType<>();
myList.stream()
      .filter...and.so.on

MyDataType实现java.util.List但只执行某些操作(add,remove,size,isEmpty,toString)。

有没有办法或者我必须从我的数据类型转换为java中实现的某种数据类型?

我目前的解决方案(实际上非​​常不健康): 在MyDataType中实现ToArray操作。并执行以下操作:

MyDataType<MyClass> myList = new MyDataType<>();
... loads of computation...
MyClass[] someList = myList.ToArray();
java.util.ArrayList badList = new java.util.ArrayList<>(Arrays.asList(someList));
badList.stream() 

有了这个,我失去了一些操作和我实现它们的方式,但至少我可以使用流和过滤......

1 个答案:

答案 0 :(得分:0)

如果您已定义自定义集合并希望能够从中生成流,那么最简单的方法是实现Spliterator。完成后,创建一个流是微不足道的。

例如,如果您有一个类Dongle并且已经实现了DongleGroup集合,那么您可以实现方法:

private Spliterator<Dongle> spliterator() {
    ...
}

public Stream<Dongle> stream() {
    return StreamSupport.stream(spliterator(), false);
}        

实现分裂器并不难,并且有很好的教程可用。您还可以使用默认的Iterable方法将Spliterator转换为spliterator

现在,您可以愉快地在课程中使用各种流功能:

myDongleGroup.stream().filter(Dongle::isRed)...