我无法完全理解流如何在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()
有了这个,我失去了一些操作和我实现它们的方式,但至少我可以使用流和过滤......
答案 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)...