JavaRush /Java-Blog /Random-DE /Kaffeepause Nr. 97. Seien Sie vorsichtig mit der optional...

Kaffeepause Nr. 97. Seien Sie vorsichtig mit der optionalen Java-Methode. So zeigen Sie Elemente aus einer Liste in Java an und summieren sie

Veröffentlicht in der Gruppe Random-DE

Seien Sie vorsichtig mit der optionalen Java-Methode

Quelle: Dev.to Laut Oracle ist ein optionalesKaffeepause Nr. 97.  Seien Sie vorsichtig mit der optionalen Java-Methode.  So zeigen Sie Elemente aus einer Liste in Java an und summieren sie - 1 Objekt „ein Containerobjekt, das einen Wert ungleich Null enthalten kann oder auch nicht“. Optional erschien erstmals in Java 8 und wurde vom SpringBoot-Team in vielen Projekten verwendet. Die häufigste Verwendung von Optionals findet in einem Spring Data-Projekt statt. Schauen wir uns die JpaRepository-Schnittstelle und eine Beispielmethode an. Zum Beispiel haben wir ein User- Objekt mit einer ganzzahligen Typ-ID und ein JpaRepository dafür.
@Repository
public interface IUserRepo extends JpaRepository<User, Integer>
{
    Optional<User> findByUserName(String userName);
}
Wir haben eine Methode definiert, die einen Benutzer anhand seines Namens sucht und ein Optional für User zurückgibt .

Bequeme Methoden optional

Optional ist in vielen Methoden enthalten, die es uns ermöglichen, sauberen und lesbaren Code zu schreiben. Es gibt jedoch eine Methode mit gefährlich unerwartetem Verhalten.

Lernen Sie die orElse-Methode kennen

Laut Oracle-Dokumentation:
public T orElse(T other)
Geben Sie den Wert zurück, falls vorhanden, andernfalls geben Sie einen anderen Wert zurück. Jetzt können wir einen Methodenaufruf als orElse- Parameter hinzufügen , der ausgeführt wird, wenn der optionale Parameter leer ist, oder? Ja, das ist richtig, aber was wäre, wenn ich Ihnen sagen würde, dass es trotzdem funktioniert, unabhängig davon, ob in Optional ein Wert steht oder nicht? Lass uns das Prüfen:
@Test
public void orElseTest()
{
    String result = Optional.of("hello").orElse(someMethod());
    assertThat(result).isEqualTo("hello");
}
private String someMethod()
{
    System.out.println("I am running !!");
    return "hola";
}
Der Test war erfolgreich, Sie werden jedoch feststellen, dass auf der Konsole die Zeile „ Ich laufe “ gedruckt wird.

Warum passiert das?

Java führt eine Methode aus, um den Wert bereitzustellen, der im Fall von Else zurückgegeben wird .

Also sei vorsichtig!

Sie müssen vorsichtig sein, wenn eine Methode in orElse möglicherweise einen Nebeneffekt hat, da sie weiterhin ausgeführt wird.

Was zu tun?

Sie können die OrElseGet- Methode verwenden , die eine Lieferantenmethode zur Ausführung benötigt, wenn Optional vorhanden ist .

So zeigen Sie Elemente aus einer Liste in Java an und summieren sie

Quelle: DZone In diesem Beitrag erfahren Sie, wie Sie die Anzahl der Elemente aus einer Liste in Java anzeigen und zusammenfassen. Das Zuordnen von Elementen aus einer Liste bedeutet , dass jedes Element in dieser Liste in ein anderes Objekt konvertiert wird. Das Summieren von Elementen aus einer Liste bedeutet, dass alle Elemente aus dieser Liste zu einem Objekt zusammengefasst werden, das nicht unbedingt vom gleichen Typ wie das Original ist. Nehmen wir an, wir haben eine Liste mit Bestellungen und jede Bestellung hat eine Liste mit Produkten.
record Order(String customer, List<Product> products) {
}

record Product(String brand, String modelName, BigDecimal price) {
}
Was würden Sie tun, wenn Sie wissen möchten, wie viel Geld aus einer Bestellliste kommt? Für jede Bestellung benötigen Sie eine Liste der darin enthaltenen Produkte und für jedes Produkt in diesen Listen müssen Sie den Preis ermitteln. Anschließend müssen Sie alle diese Preise zusammenzählen und so erhalten Sie das Ergebnis. Wenn Sie das Obige in „Map / Reduce“ übersetzen, benötigen Sie:
  1. Ordnen Sie jeder Bestellung eine Produktliste zu.
  2. Zeigen Sie den Preis für jedes Produkt an.
  3. Summieren Sie alle Preise, indem Sie sie addieren.
Machen wir es also in Java:
public class OrderMapReducer {
    public BigDecimal getTotal(List<Order> orders) {
        return orders.stream() // 1
                     .map(Order::products) // 2
                     .flatMap(List::stream) // 3
                     .map(Product::price) // 4
                     .reduce(BigDecimal::add) // 5
                     .orElse(BigDecimal.ZERO); // 6
    }
}
  1. Wir schaffen einen Auftragsfluss.
  2. Wir ordnen jede Bestellung der zugehörigen Produktliste zu.
  3. Wir ordnen jede Produktliste einem Flow zu. Beachten Sie, dass wir hier flatMap verwenden mussten , sonst würden wir am Ende Stream <Stream <Product>> erhalten .
  4. Für jedes Produkt zeigen wir seinen Preis an.
  5. Fassen wir alle Preise zusammen.
  6. Wenn die Bestellliste leer ist , geben Sie Null zurück.
Das ist alles! Jetzt können wir einen Test erstellen, um sicherzustellen, dass alles wie erwartet funktioniert.
@Test
void getTotalPrice() {
    List<Order> orders = createOrders();
    OrderMapReducer orderMapReducer = new OrderMapReducer();
    assertEquals(new BigDecimal(17800), orderMapReducer.getTotal(orders));
}

private static List<Order> createOrders() {
    var strato = new Product("Fender", "Stratocaster", new BigDecimal(3500));
    var sg = new Product("Gibson", "SG", new BigDecimal(4800));
    var lesPaul = new Product("Gibson", "Les Paul", new BigDecimal(4500));
    var rr = new Product("Jackson", "RR", new BigDecimal(5000));

    return List.of(
            new Order("David Gilmour", List.of(strato)),
            new Order("Toni Iommi", List.of(sg)),
            new Order("Randy Rhoads", List.of(lesPaul, rr))
    );
}
Wie Sie sehen, hilft Map and Reduce in Fällen, in denen Sie Informationen aus einer Sammlung extrahieren müssen .
Kommentare
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION