Jak działa Guava filter

0

Cześć,

Doczytałem właśnie, że filter z Guavy jest "live-view" kolekcji, którą przekazujemy w parametrze, która spełnia predykat.

  • Returns the elements of {@code unfiltered} that satisfy a predicate. The
    • returned set is a live view of {@code unfiltered}; changes to one affect
    • the other.
    public static final Predicate<String> PREDICATE = new Predicate<String>() {
        @Override
        public boolean apply(String zmienna) {
            return "a".equals(zmienna);
        }
    };
Set<String> pofiltrowane = Sets.filter(mojSetZeStringami, MojPredykat.PREDICATE);
  1. Teraz chciałem się dowiedzieć co dokładnie, łopatologicznie znaczy "live-view". Jakiś może przykłady z życia wzięte?
  2. Jak zaimplementować coś takiego w czystej Javie? Przecież jak mamy jakąś kolekcję iterujemy się po niej to tworzymy nową i wrzucamy odpowiednie elementy, które spełniały by warunek.

Po prostu nie rozumiem koncepcji i chciałbym ją zrozumieć.

0
  1. To znaczy ze istnieje tylko jedna kolekcja, a to co dostałeś z filtera to jest wrapper który filtruje tą kolekcje według predykatu. Nie ma tam zadnego kopiowania czegokolwiek. Jeśli wyrzucisz element z tej pierwotnej listy to w tej filtrowanej też go juz nie będzie.
  2. Wystarczy że zaimplementujesz metody w tym filtrującym wrapperze w ten sposób ze zwracasz tylko elementy spełniające warunek. Więc na przykład jak każesz iteratorowi dać "next" to on znajduje pierwszy element kolekcji który spełnia predykat.
0

@Shalom
Ale to załóżmy, że:

  1. mamy listę stringów o nazwie x ("a", "b","c")
  2. tworzymy pofiltrowaną listę o nazwie y (predykat czy "a".equals(...) )
  3. drukujemy liste x (a, b, c)
  4. drukujemy listę y (a)
  5. dodajemy do listy x element "a".
  6. drukujemy listę x (a, b,c, a)
  7. drukujemy listę y (a, a)

I jakim cudem samo wydrukowanie "odpala" jeszcze razy filtrowanie? (Może to jest problem, który komplikuje mi zrozumienie tego).

0

Bo filtrowanie odbywa się tam cały czas w runtime. Za każdym razem kiedy następuje odwołanie do elementu listy y następuje przeglądanie listy x w poszukiwaniu elementu spełniającego predykat.

0

Ok. I właśnie tego nie rozumiem. W zasadzie pierwszy raz słyszę o takim "non-stop" wykonywaniu, że odwołujemy się do jakiejś kolekcji i tam znów odpala się filtrowanie.

Magia.

O czym muszę poczytać, żeby to zrozumieć. Są jeszcze jakieś podobne przykłady, które mają takie działanie?

0

Rozważ coś takiego:

public class WrappedFilteredList<T> implements List<T> {
	private List<T> underlyingList; 
	private Predicate<T> predicate;
	
	WrappedFilteredList(List<T> list, Predicate<T> predicate){
		this.underlyingList = list;
		this.predicate = predicate;
	}
	

	// nie chcemy pozwolić na zmiany na zmiany w liście, więc:
	@Override
	public boolean add(T o){
		return false;
	}
	// podobnie dla remove, addAll, removeAll itp.
	
	// przykładowa implementacja JEDNEJ metody 
	@Override
	public boolean contains(Object o){
		return underlyingList.contains(o) && predicate.apply((T) o);
	}

	// itp. - trzeba zrobić podobne implementacje dla size(), ListIterator, sublist itp
}

Oczywiście nie jest to wzięte z biblioteki Guavy, ale jedynie propozycja, jak taki live-view zrobić.

I potem

public static <T> List<T> filtered(List<T> main, Predicate<T> predicate){
	return new WrappedFilteredList(main, predicate);
}

1 użytkowników online, w tym zalogowanych: 0, gości: 1