Как я могу заставить потоки возвращать списки? (Ява)

У меня есть следующий список:

ObservableList<String> Books;

Я знаю, что если я хочу иметь отсортированный список, я могу написать

public ObservableList<String> getBooks() {
    return Books;       
}

Теперь мой вопрос может быть довольно бессмысленным, но... есть ли способ добиться того же результата, что и выше, с потоками? Что-то вроде

Books
    .stream()
    .sorted();

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


person Mark    schedule 09.06.2016    source источник
comment
Ваш первый код даже близко не связан с сортировкой, поэтому для этого вам не нужны потоки Java.   -  person Tom    schedule 09.06.2016
comment
Ваш первый блок кода — это аксессор/геттер, который возвращает ObservableList<String> — он больше ничего не делает. Ваш второй блок кода, кажется, сортирует поток, но я не уверен. Ваш вопрос сбивает с толку/не имеет смысла.   -  person Jonny Henly    schedule 09.06.2016
comment
извините, если это было неясно, мой вопрос в основном заключался в том, как преобразовать поток в наблюдаемый список   -  person Mark    schedule 09.06.2016


Ответы (3)


Примечание: Books — это неправильное соглашение об именах переменных; используйте books.


Это действительно возможно при использовании Collector. с. Или даже Collectors. Предполагая, что ObservableList является своего рода Collection, вы можете сделать следующее:

ObservableList<String> hereYouGo = Books.stream()
      .sorted()
      .collect(Collectors.toCollection(ObservableList::new));

Где ObservableList::new поставщик пустого ObservableList для коллектора. Измените это, если ваш класс работает иначе.

person bcsb1001    schedule 09.06.2016
comment
Этот сработал, большое спасибо! Мне просто нужно было изменить ObservableList::new на FXCollections::observableArrayList в моем классе. - person Mark; 09.06.2016

Вам нужно использовать Collector, чтобы превратить поток обратно в список. Если вам все равно, какой это список, есть встроенный сборщик:

getBooks().stream().sorted().collect(Collectors.toList())

Если это должен быть ObservableList, вам нужно изобрести свой собственный Collector:

getBooks().stream().sorted
    .collect(ObservableList::new, ObservableList::add, ObservableList::addAll);
person Andrew Rueckert    schedule 09.06.2016
comment
toCollection() тоже вещь. - person bcsb1001; 09.06.2016

Если вы хотите отсортировать список на месте, потоки не нужны, вы можете просто вызвать

Collections.sort(books);

Если вы хотите вернуть новый отсортированный ObservableList<Book> с помощью потоков, вы можете сделать это:

ObservableList<Book> sortedBooks = books.stream()
        .sorted()
        .collect(Collectors.toList(FXCollections::observableArrayList));
person shmosel    schedule 09.06.2016