2015-11-21 8 views
7

È possibile che i Collector restituiscano un ObservableArrayList? Un po 'come questo:Collector lambda return osservable list

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

È appena fatto, vero? – assylias

+1

@assylias No, non esiste un costruttore per 'ObservableArrayList' (non è un evento una classe in realtà) – Tunaki

risposta

14

ObservableList s vengono creati con le fabbriche statici della classe FXCollections.

È possibile eseguire quanto segue, che prima raccoglie lo stream in un List e lo avvolge all'interno di uno ObservableList.

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

(che purtroppo non sufficiente compilare su Eclipse 4.5.1 Marte, ma compila bene sulla javac 1.8.0_60).

Un'altra possibilità è creare un servizio di raccolta personalizzato per questo. Questo ha il vantaggio che non è necessario utilizzare prima un List. Gli elementi sono raccolti direttamente all'interno di uno 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; }) 
      ); 

Come notato da Louis Wasserman in the comments, questa ultima espressione può essere riscritta più semplicemente utilizzando toCollection:

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

l'ultima espressione sembra brutta. Grazie – Josephus87

+1

@ Josephus87 Le importazioni statiche aiutano un po '. Inoltre, ho aggiunto una seconda possibilità che non utilizza una lista intermedia. – Tunaki

+3

Perché non solo 'collect (toCollection (FXCollections :: observableArrayList))', che risolve entrambi i problemi? –