2015-11-21 2 views
7

Возможно ли, чтобы коллекционеры вернули мне ObservableArrayList? Немного как это:Коллекционеры лямбда-ответный наблюдаемый список

ObservableList<String> newList = list.stream(). 
     filter(x -> x.startsWith("a"). 
     collect(Collectors.toCollection(ObservableArrayList::new)); 
+0

Вы просто сделали это, не так ли? – assylias

+1

@assylias Нет, конструктор для 'ObservableArrayList' (это не событие класса на самом деле) – Tunaki

ответ

14

ObservableList s создаются с помощью статических фабрик из FXCollections класса.

Вы можете сделать следующее, которое сначала собирает поток в List, а затем обертывает его внутри ObservableList.

ObservableList<String> newList = 
     list.stream() 
      .filter(x -> x.startsWith("a")) 
      .collect(Collectors.collectingAndThen(toList(), l -> FXCollections.observableArrayList(l))); 

(которая достаточно, к сожалению, не компилируется на Eclipse, Mars 4.5.1, но отлично компилируется на javac 1.8.0_60).

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

ObservableList<String> newList = 
     list.stream() 
      .filter(x -> x.startsWith("a")) 
      .collect(Collector.of(
       FXCollections::observableArrayList, 
       ObservableList::add, 
       (l1, l2) -> { l1.addAll(l2); return l1; }) 
      ); 

Как отметил Луи Вассермана in the comments, это последнее выражение можно переписать более просто с помощью toCollection:

ObservableList<String> newList = 
     list.stream() 
      .filter(x -> x.startsWith("a")) 
      .collect(Collectors.toCollection(FXCollections::observableArrayList)); 
+1

, что последнее выражение выглядит противным. Спасибо – Josephus87

+1

@ Josephus87 Статический импорт немного помогает. Кроме того, я добавил вторую возможность, которая не использует промежуточный список. – Tunaki

+3

Почему бы не просто «собрать (toCollection (FXCollections :: observableArrayList))', который решает обе проблемы? –

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