JavaRush /Java Blog /Random-ID /Rehat kopi #97. Hati-hati dengan metode Java Opsional. Ca...

Rehat kopi #97. Hati-hati dengan metode Java Opsional. Cara menampilkan dan menjumlahkan elemen dari daftar di Java

Dipublikasikan di grup Random-ID

Hati-hati dengan metode Java Opsional

Sumber: Dev.to Rehat kopi #97.  Hati-hati dengan metode Java Opsional.  Cara menampilkan dan menjumlahkan elemen dari daftar di Java - 1 Menurut Oracle, objek Opsional adalah “objek kontainer yang mungkin berisi atau tidak berisi nilai bukan nol.” Opsional pertama kali muncul di Java 8 dan telah digunakan oleh tim SpringBoot di banyak proyek. Penggunaan Opsional yang paling umum adalah dalam proyek Spring Data. Mari kita lihat antarmuka JpaRepository dan contoh metodenya. Misalnya, kita memiliki objek Pengguna dengan tipe integer Id dan kita memiliki JpaRepository untuk itu.
@Repository
public interface IUserRepo extends JpaRepository<User, Integer>
{
    Optional<User> findByUserName(String userName);
}
Kami telah mendefinisikan metode yang mencari pengguna berdasarkan namanya dan mengembalikan Opsional untuk User .

Metode Nyaman Opsional

Opsional disertakan dalam banyak metode yang memungkinkan kita menulis kode yang bersih dan mudah dibaca.
  • peta(..).atau(...)
  • peta(...).atauLainnya(...)
  • daftar lengkap dapat ditemukan di dokumentasi Oracle .
Namun, ada satu metode dengan perilaku berbahaya yang tidak terduga.

Temui metode orElse

Menurut dokumentasi Oracle:
public T orElse(T other)
Kembalikan nilainya jika ada, jika tidak, kembalikan yang lain. Sekarang kita bisa menambahkan pemanggilan metode sebagai parameter orElse yang akan dijalankan jika parameter Opsional kosong, bukan? Ya, itu benar, tetapi bagaimana jika saya memberi tahu Anda bahwa itu akan tetap berfungsi, terlepas dari apakah Opsional ada nilainya atau tidak. Mari kita periksa:
@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";
}
Tes berhasil, tetapi Anda akan melihat bahwa baris “ Saya sedang berlari ” tercetak di konsol.

Mengapa ini terjadi?

Java menjalankan metode untuk memberikan nilai yang akan dikembalikan dalam kasus Else .

Jadi berhati-hatilah!

Anda harus berhati-hati jika suatu metode di dalam orElse mungkin mempunyai efek samping karena akan tetap dijalankan.

Apa yang harus dilakukan?

Anda dapat menggunakan metode OrElseGet , yang memerlukan metode pemasok untuk dijalankan jika Opsional ada .

Cara menampilkan dan menjumlahkan elemen dari daftar di Java

Sumber: DZone Dalam postingan ini, Anda akan mempelajari cara menampilkan dan meringkas jumlah elemen dari daftar di Java. Memetakan item dari Daftar berarti setiap item dalam daftar tersebut akan dikonversi ke objek berbeda. Menjumlahkan elemen dari suatu daftar berarti semua elemen dari daftar tersebut akan digabungkan menjadi satu objek, yang belum tentu bertipe sama dengan objek aslinya. Katakanlah kita memiliki daftar pesanan, dan setiap pesanan memiliki daftar produk.
record Order(String customer, List<Product> products) {
}

record Product(String brand, String modelName, BigDecimal price) {
}
Apa yang akan Anda lakukan jika Anda ingin mengetahui berapa banyak uang yang masuk dari daftar pesanan? Untuk setiap pesanan, Anda perlu mendapatkan daftar produk yang ada di dalamnya, dan untuk setiap produk dalam daftar ini, Anda perlu mendapatkan biayanya. Setelah itu, Anda perlu menjumlahkan semua harga tersebut, dan inilah bagaimana Anda mendapatkan hasilnya. Saat menerjemahkan di atas ke Map / Reduce Anda memerlukan:
  1. Cocokkan setiap pesanan dengan daftar produk.
  2. Tampilkan harga untuk setiap produk.
  3. Jumlahkan semua harga dengan menjumlahkannya.
Jadi mari kita lakukan di 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. Kami menciptakan aliran pesanan.
  2. Kami mencocokkan setiap pesanan dengan daftar produknya.
  3. Kami mencocokkan setiap daftar produk dengan alur. Perhatikan bahwa kami harus menggunakan flatMap di sini , jika tidak, kami akan mendapatkan Stream <Stream <Product>> .
  4. Untuk setiap produk kami menampilkan harganya.
  5. Mari kita jumlahkan semua harga.
  6. Jika Daftar Pesanan kosong , kembalikan nol.
Itu saja! Sekarang kita dapat membuat tes untuk memastikan semuanya berjalan sesuai harapan.
@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))
    );
}
Seperti yang Anda lihat, Map dan Reduce membantu jika Anda perlu mengekstrak informasi dari Collection .
Komentar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION