JavaRush /Blog Java /Random-VI /Nghỉ giải lao #97. Hãy cẩn thận với phương pháp Tùy chọn ...

Nghỉ giải lao #97. Hãy cẩn thận với phương pháp Tùy chọn Java. Cách hiển thị và tính tổng các phần tử từ danh sách trong Java

Xuất bản trong nhóm

Hãy cẩn thận với phương pháp Tùy chọn Java

Nguồn: Dev.to Nghỉ giải lao #97.  Hãy cẩn thận với phương pháp Tùy chọn Java.  Cách hiển thị và tính tổng các phần tử trong danh sách trong Java - 1 Theo Oracle, một đối tượng Tùy chọn là “một đối tượng chứa có thể chứa hoặc không chứa giá trị khác null”. Tùy chọn xuất hiện lần đầu tiên trong Java 8 và đã được nhóm SpringBoot sử dụng trong nhiều dự án. Việc sử dụng Tùy chọn phổ biến nhất là trong dự án Dữ liệu mùa xuân. Hãy xem giao diện JpaRepository và một phương thức ví dụ. Ví dụ: chúng tôi có một đối tượng Người dùng có Id kiểu số nguyên và chúng tôi có JpaRepository cho nó.
@Repository
public interface IUserRepo extends JpaRepository<User, Integer>
{
    Optional<User> findByUserName(String userName);
}
Chúng tôi đã xác định một phương thức tra cứu người dùng theo tên của họ và trả về Tùy chọn cho Người dùng .

Phương pháp thuận tiện Tùy chọn

Tùy chọn được bao gồm trong nhiều phương pháp cho phép chúng ta viết mã rõ ràng và dễ đọc.
  • bản đồ(..).hoặc(...)
  • bản đồ(...).hoặcElse(...)
  • một danh sách đầy đủ có thể được tìm thấy trong tài liệu của Oracle .
Tuy nhiên, có một phương pháp có hành vi nguy hiểm bất ngờ.

Gặp phương pháp orElse

Theo tài liệu của Oracle:
public T orElse(T other)
Trả về giá trị nếu có, nếu không thì trả về giá trị khác. Bây giờ chúng ta có thể thêm lệnh gọi phương thức dưới dạng tham số orElse sẽ chạy nếu tham số Tùy chọn trống, phải không? Vâng, điều đó đúng, nhưng điều gì sẽ xảy ra nếu tôi nói với bạn rằng nó vẫn hoạt động, bất kể có giá trị trong Tùy chọn hay không. Hãy kiểm tra:
@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";
}
Quá trình thử nghiệm đã thành công, nhưng bạn sẽ nhận thấy dòng “ Tôi đang chạy ” được in trên bảng điều khiển.

Tại sao chuyện này đang xảy ra?

Java chạy một phương thức để cung cấp giá trị sẽ được trả về trong trường hợp Else .

Vì vậy hãy cẩn thận!

Bạn phải cẩn thận nếu một phương thức bên trong orElse có thể có tác dụng phụ vì nó vẫn được chạy.

Phải làm gì?

Bạn có thể sử dụng phương thức OrElseGet , phương thức này sử dụng phương thức của nhà cung cấp để thực thi nếu Tùy chọn tồn tại .

Cách hiển thị và tính tổng các phần tử từ danh sách trong Java

Nguồn: DZone Trong bài đăng này, bạn sẽ tìm hiểu cách hiển thị và tóm tắt số phần tử từ một danh sách trong Java. Ánh xạ các mục từ Danh sách có nghĩa là mỗi mục trong danh sách đó sẽ được chuyển đổi thành một đối tượng khác. Tính tổng các phần tử từ một danh sách có nghĩa là tất cả các phần tử từ danh sách đó sẽ được kết hợp thành một đối tượng, không nhất thiết phải cùng loại với đối tượng ban đầu. Giả sử chúng ta có một danh sách đơn hàng và mỗi đơn hàng có một danh sách sản phẩm.
record Order(String customer, List<Product> products) {
}

record Product(String brand, String modelName, BigDecimal price) {
}
Bạn sẽ làm gì nếu muốn biết số tiền thu được từ một danh sách đơn hàng là bao nhiêu? Đối với mỗi đơn hàng, bạn sẽ cần có danh sách các sản phẩm có trong đó và đối với mỗi sản phẩm trong danh sách này, bạn sẽ cần biết giá thành của nó. Sau đó, bạn cần tổng hợp tất cả các mức giá này và đây là cách bạn nhận được kết quả. Khi dịch phần trên sang Map / Reduce bạn cần:
  1. Ghép mỗi đơn hàng với một danh sách sản phẩm.
  2. Hiển thị giá cho từng sản phẩm.
  3. Tổng hợp tất cả giá bằng cách cộng chúng lại với nhau.
Vì vậy, hãy làm điều đó trong 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. Chúng tôi tạo ra một luồng đơn đặt hàng.
  2. Chúng tôi khớp từng đơn hàng với danh sách sản phẩm của nó.
  3. Chúng tôi khớp từng danh sách sản phẩm với một quy trình. Lưu ý rằng chúng tôi phải sử dụng FlatMap ở đây , nếu không chúng tôi sẽ kết thúc với Stream <Stream <Product>> .
  4. Đối với mỗi sản phẩm chúng tôi hiển thị giá của nó.
  5. Hãy tổng hợp tất cả các giá.
  6. Nếu Danh sách đơn hàng trống , trả về số 0.
Đó là tất cả! Bây giờ chúng ta có thể tạo một bài kiểm thử để đảm bảo mọi thứ đều hoạt động như mong đợi.
@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))
    );
}
Như bạn có thể thấy, Map và Giảm giúp ích trong trường hợp bạn cần trích xuất thông tin từ Bộ sưu tập .
Bình luận
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION