Filtrowanie w strumieniu

0

Witam,
Używam takiej metody do filtrowania zwracanych książek:

public List<BookDTO> findAllByUserAndParams(User user, Map<String,String> params) {	
		List<BookDTO> filteredList =
		findAllByUser(user)
			.stream()
			.filter(b -> params.get("author")!=null? b.getAuthor().contains(params.get("author")) : true)
			.filter(b -> params.get("title")!=null? b.getTitle().contains(params.get("title")) : true)
			.filter(b -> params.get("publisher")!=null? b.getPublisher().contains(params.get("publisher")) : true)
			.filter(b -> params.get("type")!=null? b.getType().getName().equals(params.get("type")) : true)
			.filter(b -> params.get("status")!=null? b.getStatus().getDescription().equals(params.get("status")) : true)
			.collect(Collectors.toList());
		
		return filteredList;
	}

Dodam jedynie, że status i typ mają zdefiniowany enum z polem (name/description) typu String. Niby wszystko działa, jest w miarę zwięźle, ale te "pociągi" trochę mnie martwią. Czy jest sposób, żeby to lepiej zapisać (rozpisać lambdy czy coś)? Może w ogóle da się to zrobić jakoś lepiej?

0

A tych userów masz z bazy? W sensie metoda findAllByUser() woła jakąś DB? Bo jak tak to takie filtrowanie robiłbym na zapytaniu do bazy a nie po wyciągnięciu całości. Jakiegoś CriteriaBuilder bym użył..

0

Po ostatnim temacie, który tego dotyczył poczytałem trochę o konfiguracji security i użytkownik jest wyciągany w kontrolerze i przekazywany jako parametr. FindAllByUser() jedynie wywołuje metodę bezpośrednio z repo i mapuje znalezione obiekty na DTO.

0

To ja bym zrobił metodę która woła repo w stylu: findBooksByUserAndFilter i całą obsługę filtrowania przeniósł na stronę zapytania do bazy. Filtrowanie w pamięci się zawali przy większej ilości rekordów.

0

Właściwie to dokładnie zdaję sobie z tego sprawę, że w normalnych warunkach (ogromna ilość danych w BD) to nie ma najmniejszego sensu. Pytam bardziej od strony zapisu samego filtrowania. Z drugiej strony, skoro zakładam, że użytkownik będzie posiadał w ekstremalnych wypadkach 100-200 książek to czy takie ładowanie do pamięci i filtrowanie ma wtedy przewagę nad budowaniem zapytania z wieloma warunkami?

1

Ładny copypaste. Teraz wydziel z tego JEDNĄ metodę filterByField(lambda,string) a potem zastanowimy się dalej...

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