net.ranides.assira.collection.list
Class ListAdapter<T,S>

java.lang.Object
  extended by java.util.AbstractCollection<E>
      extended by java.util.AbstractList<T>
          extended by net.ranides.assira.collection.list.ListAdapter<T,S>
Type Parameters:
T - format publiczny, udostępniany konsumentowi
S - wewnętrzny format danych
All Implemented Interfaces:
Iterable<T>, Collection<T>, List<T>, Function<T,S>
Direct Known Subclasses:
ListAdapterTT, ListBiAdapter

public abstract class ListAdapter<T,S>
extends AbstractList<T>
implements Function<T,S>

Klasa abstrakcyjna umożliwiająca leniwą konwersję listy elementów na inny format (a więc tworzenie list tylko do odczytu).

Ogólny wariant adaptera zakłada, że konwersja może zwracać jako wynik obiekty innej klasy, niż źródłowa. Specjalizacja ListAdapterTT służy do przeprowadzania konwersji, które mają wpływ jedynie na wartości, ale nie na klasy elementów.

Oszczędza pamięć i czas procesora: nie musimy foreach'em konwertować wszystkiego ze starej listy i kopiować do nowej. Konwersja odbywa się w locie.

Rozwiązuje problem przekazania danych w określonym formacie do widoku, który ma prawo jedynie je odczytywać - a nie modyfikować. Próba modyfikacji powoduje wyjątek zamiast "cichego" nieokreślonego zachowania polegającego na modyfikowaniu listy w oparciu o wiązania "do referencji"

W metodzie apply można nie tylko konwertować wartości, ale również logować operacje odczytu.
Z tego powodu adapter może być użyty z powodzeniem jako wydajna realizacja obserwatora.

Author:
ranides

Constructor Summary
ListAdapter(List<S> content)
          Tworzy nowy adapter odwzorowujący podaną listę.
ListAdapter(S[] content)
          Tworzy nowy adapter odwzorowujący podaną tablicę.
 
Method Summary
 List<T> apply()
          Wykonuje natychmiast pełną konwersję wszystkich elementów i jako wynik zwraca nową tablicę, która jest w pełni niezależna od adaptera oraz kolekcji źródłowej.
static
<S,T> List<T>
apply(Collection<S> content, Function<T,S> function)
          Metoda statyczna pozwalająca transformować podaną listę za pomocą przekazanego operatora konwersji.
 T get(int index)
           
static
<S,T> List<S>
inverse(Collection<T> content, CoFunction<T,S> function)
          Metoda statyczna pozwalająca transformować podaną listę za pomocą przekazanego operatora konwersji.
 int size()
           
 
Methods inherited from class java.util.AbstractList
add, add, addAll, clear, equals, hashCode, indexOf, iterator, lastIndexOf, listIterator, listIterator, remove, set, subList
 
Methods inherited from class java.util.AbstractCollection
addAll, contains, containsAll, isEmpty, remove, removeAll, retainAll, toArray, toArray, toString
 
Methods inherited from class java.lang.Object
getClass, notify, notifyAll, wait, wait, wait
 
Methods inherited from interface net.ranides.assira.generic.Function
apply
 
Methods inherited from interface java.util.List
addAll, contains, containsAll, isEmpty, remove, removeAll, retainAll, toArray, toArray
 

Constructor Detail

ListAdapter

public ListAdapter(List<S> content)
Tworzy nowy adapter odwzorowujący podaną listę.

Parameters:
content -

ListAdapter

public ListAdapter(S[] content)
Tworzy nowy adapter odwzorowujący podaną tablicę.

Parameters:
content -
Method Detail

get

public T get(int index)
Specified by:
get in interface List<T>
Specified by:
get in class AbstractList<T>

size

public int size()
Specified by:
size in interface Collection<T>
Specified by:
size in interface List<T>
Specified by:
size in class AbstractCollection<T>

apply

public List<T> apply()
Wykonuje natychmiast pełną konwersję wszystkich elementów i jako wynik zwraca nową tablicę, która jest w pełni niezależna od adaptera oraz kolekcji źródłowej.

Adapter dokonuje konwersji przy każdej operacji odczytu, zwracając najbardziej aktualną i zsynchronizowaną wartość. Jeśli lista źródłowa nie jest często modyfikowana, a adapter jest bardzo intensywnie używany (wielokrotne iterowanie po całej zawartości) optymalniejszym rozwiązaniem może być wywołanie poniższej metody i praca na zwróconej kopii.

Użycie metody może oszczędzić nam wielokrotnego dokonywania tych samych konwersji (a więc czas procesora) ale tracimy całą oszczędność pamięciową.

Returns:

apply

public static <S,T> List<T> apply(Collection<S> content,
                                  Function<T,S> function)
Metoda statyczna pozwalająca transformować podaną listę za pomocą przekazanego operatora konwersji. Jako wynik zwraca nową, zupełnie niezależną listę z przekonwertowanymi obiektami.

Type Parameters:
S -
T -
Parameters:
content - transformowana lista
function -
Returns:

inverse

public static <S,T> List<S> inverse(Collection<T> content,
                                    CoFunction<T,S> function)
Metoda statyczna pozwalająca transformować podaną listę za pomocą przekazanego operatora konwersji. Jako wynik zwraca nową, zupełnie niezależną listę z przekonwertowanymi obiektami.

Type Parameters:
S -
T -
Parameters:
content - transformowana lista
function -
Returns:


Copyright © 2013. All Rights Reserved.