2015-12-24 4 views
-1

Я не могу полностью понять, как потоки работают на Java. Можете ли вы создать абстрактный тип данных, например MyArrayList, и использовать поток на нем каким-то образом?Java, использующий потоки на абстрактных типах данных?

Что-то вроде:

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

MyDataType реализует java.util.List, но только некоторые операции (добавление, удаление, размер, 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

'Stream' является интерфейсом. 'Collection' - еще один интерфейс. –

+0

И ArrayList является конкретным, а не абстрактным. Возможно, вам лучше объяснить более подробно то, что мотивирует этот вопрос. Что вы пытаетесь сделать в целом (а не как вы это делаете)? –

+0

Я имел в виду сделать свой собственный тип данных под названием ArrayList. Я только сделал это более запутанным с этим примером. Могу ли я использовать потоки в моей переменной myList из фрагмента кода? – Mocktheduck

ответ

0

Если вы определили пользовательскую коллекцию и хотят иметь возможность генерировать поток из него, тогда самый простой подход - реализовать Spliterator. Как только вы сделали это, создание потока тривиально.

Например, если у вас есть класс Dongle и реализовали DongleGroup коллекцию, то вы могли бы реализовать методы:

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

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

Реализация spliterator не трудно и есть хорошие учебники на нем доступны. Вы также можете преобразовать Iterable в Spliterator с использованием метода spliterator по умолчанию.

Теперь вы можете спокойно использовать различные возможности потока с классами:

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

Я думаю, это было бы единственным решением, хотя это звучит так много, я не буду его использовать. Я подожду до завтра и увижу, что другие придут, если нет, это все. – Mocktheduck

Смежные вопросы