Vavr + Option + flatMap() -> boolean ?

0

Hej, mam pytanie jak ugryźć taki kawałek kodu:

@Getter
@RequiredArgsConstructor
public class Order {
    private final Long id;
    private final List<Product> products;
}

@Getter
@RequiredArgsConstructor
public class Product {
    private final String productName;
    private final int amount;
    private final BigDecimal unitPrice;
}

...
    boolean processOrder(Order order) {
        return Option.of(order)
                .toStream() // ???
                .flatMap(Order::getProducts)
                .exists(x -> x.getAmount() > 10);
    }

Logika jest mniej więcej taka że z obiektu Order wyciągam List<product>. Przechodząc po Product staram się znaleźć czy jakikolwiek z nich spełni daną logikę. Wtedy zwracam dajmy na to true.

  1. Czy takie założenie może mieć sens? Czy nie jest to przekombinowane?
    Order -> Option<order> -> lista Product -> boolean
  2. Czy można to jakoś zrobić bez .toStream() ?
  3. Jak się zabezpieczyć w takim wypadku na Null Safety? Np gdy new Order(1L, null). Czyli List<product> jest null.
  4. Czym się różni .flatMap() na streamie a czym na Option ?
0

Hm, według mnie nie wiesz do końca do czego służy stream, a do czego służy Option. Ogólnie Option to monada, która pozwala nam ograć efekt uboczny, w którym coś jest lub czegoś nie ma. Stream pozwala nam "opakować" dane tak żebyśmy mogli sobie wykonywać na nich dowolne operacje.
Podstawowe w Twoim przypadku to: w którym momencie możesz spodziewać się nulla? Order jest nullable? Lista jego produktów może być nullem (choć tu po prostu lepiej mieć pustą listę niż nulla)?

0
lavoholic napisał(a):

Podstawowe w Twoim przypadku to: w którym momencie możesz spodziewać się nulla? Order jest nullable? Lista jego produktów może być nullem (choć tu po prostu lepiej mieć pustą listę niż nulla)?

W tym przypadku założyłem że Order również może być Nullem :D Czasami mam wrażenie że te Nulle mnie przerastają...
Z tą listą to jest fajny pomysł. Jak najlepiej to zabezpieczyć tworzeniem pustej listy? Raczej nie mogę zdefiniować na poziomie class field jeśli chcę korzystać z vavr collection api.

2

Założenie że Order jest nulem jako parametr wejsciowy jest raczej błędne. Tzn zanim wywołasz danę metodę na obiekcie order to powineneś sprawdzić czy taki jest nullem (jeśli w ogóle może nastąpić taka sytuacja.
W przypadki Api Stream od sprawdzenia czy jakis element spełnia warunek jest metoda anyMatch(Predicate<? super T> predicate) i to jej ewentualnie powinieneś użyć czyli

order.getProducts()
.stream()
.anyMatch(p -> p.getPrice().compareTo(MIN_AMOUNT) >= 0)

W przypadku kolekcji Vavr chyba trzeba skorzystać z count

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