Filtrowanie w strumieniu

Filtrowanie w strumieniu
P4
  • Rejestracja:około 6 lat
  • Ostatnio:prawie 6 lat
  • Postów:9
0

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

Kopiuj
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?

MrMadMatt
  • Rejestracja:ponad 9 lat
  • Ostatnio:5 dni
  • Postów:373
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ł..

P4
  • Rejestracja:około 6 lat
  • Ostatnio:prawie 6 lat
  • Postów:9
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.

MrMadMatt
  • Rejestracja:ponad 9 lat
  • Ostatnio:5 dni
  • Postów:373
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.

edytowany 1x, ostatnio: MrMadMatt
P4
  • Rejestracja:około 6 lat
  • Ostatnio:prawie 6 lat
  • Postów:9
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?

Shalom
  • Rejestracja:ponad 21 lat
  • Ostatnio:około 3 lata
  • Lokalizacja:Space: the final frontier
  • Postów:26433
1

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


"Nie brookliński most, ale przemienić w jasny, nowy dzień najsmutniejszą noc - to jest dopiero coś!"
edytowany 1x, ostatnio: Shalom

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.