JavaRush /Blog Java /Random-MS /Rehat kopi #97. Berhati-hati dengan kaedah Pilihan Java. ...

Rehat kopi #97. Berhati-hati dengan kaedah Pilihan Java. Bagaimana untuk memaparkan dan menjumlahkan elemen daripada senarai dalam Java

Diterbitkan dalam kumpulan

Berhati-hati dengan kaedah Pilihan Java

Sumber: Dev.to Rehat kopi #97.  Berhati-hati dengan kaedah Pilihan Java.  Bagaimana untuk memaparkan dan menjumlahkan elemen daripada senarai dalam Java - 1 Menurut Oracle, objek Pilihan ialah "objek kontena yang mungkin mengandungi nilai bukan nol atau tidak." Pilihan pertama kali muncul dalam Java 8 dan telah digunakan oleh pasukan SpringBoot dalam banyak projek. Penggunaan Pilihan yang paling biasa adalah dalam projek Spring Data. Mari lihat antara muka JpaRepository dan kaedah contoh. Sebagai contoh, kami mempunyai objek Pengguna dengan Id jenis integer dan kami mempunyai JpaRepository untuknya.
@Repository
public interface IUserRepo extends JpaRepository<User, Integer>
{
    Optional<User> findByUserName(String userName);
}
Kami telah menentukan kaedah yang mencari pengguna dengan nama mereka dan mengembalikan Pilihan untuk Pengguna .

Kaedah Mudah Pilihan

Pilihan disertakan dalam banyak kaedah yang membolehkan kami menulis kod yang bersih dan boleh dibaca.
  • peta(..).atau(...)
  • peta(...).atauLain(...)
  • senarai lengkap boleh didapati dalam dokumentasi Oracle .
Walau bagaimanapun, terdapat satu kaedah dengan tingkah laku yang berbahaya di luar jangkaan.

Temui kaedah orElse

Menurut dokumentasi Oracle:
public T orElse(T other)
Kembalikan nilai jika ada, sebaliknya kembalikan sesuatu yang lain. Sekarang kita boleh menambah panggilan kaedah sebagai parameter orElse yang akan dijalankan jika parameter Pilihan kosong, bukan? Ya, itu betul, tetapi bagaimana jika saya memberitahu anda bahawa ia akan berfungsi juga, tidak kira sama ada terdapat nilai dalam Pilihan atau tidak. Mari semak:
@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";
}
Ujian ini berjaya, tetapi anda akan melihat bahawa baris " Saya sedang berjalan " dicetak pada konsol.

Kenapa ini terjadi?

Java menjalankan kaedah untuk memberikan nilai yang akan dikembalikan dalam kes Else .

Jadi berhati-hati!

Anda perlu berhati-hati jika kaedah di dalam orElse mungkin mempunyai kesan sampingan kerana ia masih akan dijalankan.

Apa nak buat?

Anda boleh menggunakan kaedah OrElseGet , yang memerlukan kaedah pembekal untuk dilaksanakan jika Pilihan wujud .

Bagaimana untuk memaparkan dan menjumlahkan elemen daripada senarai dalam Java

Sumber: DZone Dalam siaran ini, anda akan belajar cara memaparkan dan meringkaskan bilangan elemen daripada senarai dalam Java. Pemetaan item daripada Senarai bermakna setiap item dalam senarai itu akan ditukar kepada objek yang berbeza. Menjumlahkan elemen daripada senarai bermakna semua elemen daripada senarai itu akan digabungkan menjadi satu objek, yang tidak semestinya jenis yang sama seperti yang asal. Katakan kita mempunyai senarai pesanan, dan setiap pesanan mempunyai senarai produk.
record Order(String customer, List<Product> products) {
}

record Product(String brand, String modelName, BigDecimal price) {
}
Apakah yang akan anda lakukan jika anda ingin tahu berapa banyak wang yang datang daripada senarai pesanan? Untuk setiap pesanan, anda perlu mendapatkan senarai produk yang terdapat di dalamnya dan untuk setiap produk dalam senarai ini, anda perlu mendapatkan kosnya. Selepas itu, anda perlu merumuskan semua harga ini, dan ini adalah bagaimana anda mendapat hasilnya. Apabila menterjemah di atas kepada Peta / Kurangkan anda perlukan:
  1. Padankan setiap pesanan dengan senarai produk.
  2. Paparkan harga bagi setiap produk.
  3. Jumlahkan semua harga dengan menambahkannya bersama-sama.
Jadi mari kita lakukan di Jawa:
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 mencipta aliran pesanan.
  2. Kami memadankan setiap pesanan dengan senarai produknya.
  3. Kami memadankan setiap senarai produk dengan aliran. Ambil perhatian bahawa kami terpaksa menggunakan flatMap di sini , jika tidak, kami akan berakhir dengan Stream <Stream <Product>> .
  4. Untuk setiap produk kami paparkan harganya.
  5. Mari kita ringkaskan semua harga.
  6. Jika Senarai Pesanan kosong , kembalikan sifar.
Itu sahaja! Sekarang kita boleh membuat ujian untuk memastikan semuanya berfungsi seperti yang diharapkan.
@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 and Reduce membantu dalam kes di mana anda perlu mengekstrak maklumat daripada Koleksi .
Komen
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION