JavaRush /Blog Java /Random-VI /Nghỉ giải lao #163. Sự khác biệt giữa lambda và tham chiế...

Nghỉ giải lao #163. Sự khác biệt giữa lambda và tham chiếu phương thức là gì? 5 cách nối chuỗi Null trong Java

Xuất bản trong nhóm

Sự khác biệt giữa tham chiếu phương thức và lambda là gì

Nguồn: Reddit IntelliJ IDEA đề xuất thay thế biểu thức lambda bằng tham chiếu phương thức. sự khác biệt giữa chúng là gì? Nghỉ giải lao #163.  Sự khác biệt giữa lambda và tham chiếu phương thức là gì?  5 Cách Nối Chuỗi Null Trong Java - 1Hóa ra có một sự khác biệt nhỏ giữa biểu thức lambda và tham chiếu phương thức. Ví dụ: so sánh: myInstance::getStuff() ->myInstance.getStuff() . Nói chung, cả hai lựa chọn đều tương đương với nhau. Nhưng nếu myInstance là null và lambda tạo ra một con trỏ null khi đánh giá lambda thì một tham chiếu phương thức sẽ được tạo ngay lập tức khi cố gắng truy cập vào tham chiếu đó. Vậy thì sao? Nói chung, điều này rất quan trọng nếu mã đánh giá biểu thức lambda nằm trong một bản thử bắt bằng con trỏ rỗng. Ví dụ: tôi có một hàm mightBeNull(Supplier<T> function) thực hiện chức năng như thế này:
try {
    doStuff(function.get().getSomeMore().getSomeMore());
} catch (NullPointerException e) {
    doOtherStuff();
}
Nếu lệnh gọi mightBeNull(() -> myNullVariable.getStuff()) hoạt động mà không đưa ra ngoại lệ, thì "tương đương": mightBeNull(myNullVariable::getStuff) sẽ ném NullPointerException ngay lập tức khi hàm được gọi. Đó là sự khác biệt. Ghi chú. Theo Stackoverflow, nếu bạn thay thế lambda bằng tham chiếu phương thức, mã byte của lớp sẽ nhỏ gọn hơn, điều đó có nghĩa là lớp sẽ tải vào JVM nhanh hơn. Tuy nhiên, để đạt được lợi ích như vậy, cần có hàng nghìn lambdas chưa được tối ưu hóa. Tuy nhiên, trong một dự án lớn, con số này có thể dễ dàng được tích lũy. Mặt khác, việc lựa chọn giữa lambda và tham chiếu phương thức là vấn đề về sở thích và khả năng đọc mã. Ví dụ: nếu lambda có nhiều dòng thì khả năng đọc sẽ giảm và mã sẽ chỉ có lợi nếu lambda được đặt trong một phương thức riêng biệt và sử dụng tham chiếu đến nó.

5 cách nối chuỗi Null trong Java

Nguồn: Gitconnected Sau khi đọc bài đăng này, bạn sẽ tìm hiểu thêm các cách làm việc với chuỗi trong Java. Java cung cấp nhiều cách để nối chuỗi, nhưng đôi khi khi chúng ta không chú ý đến chuỗi null, chúng ta có thể kết thúc bằng null, đây rõ ràng không phải là điều chúng ta mong muốn. Vì vậy, hãy sử dụng các phương pháp được đề xuất của tôi để tránh giá trị null khi nối Chuỗi.

Phân tích vấn đề

Nếu chúng ta muốn nối các mảng chuỗi, chúng ta chỉ cần sử dụng toán tử +. Tuy nhiên, chúng ta có thể gặp phải giá trị null khi thực hiện việc này .
String[] values = {"https", "://", "gist.", "github", ".com", null};
String result = "";

for (String value : values) {
    result = result + value;
}
Kết hợp tất cả các yếu tố này dẫn chúng ta đến kết quả này:
https://Gist.github.comnull
Mặc dù chúng tôi đã tìm thấy sự cố nhưng giá trị null thu được cũng được nối thành một chuỗi, đây rõ ràng không phải là điều chúng tôi mong đợi. Và ngay cả khi chúng ta đang làm việc trên Java 8 trở lên, sử dụng phương thức tĩnh String.join() để nối các chuỗi, chúng ta vẫn sẽ nhận được các giá trị null .
String[] values = {"https", "://", "gist.", "github", ".com", null};
String result = String.join("", values);
Kết quả là như nhau:
https://Gist.github.comnull
Vậy làm thế nào để giải quyết vấn đề này? Có một số giải pháp. Để dễ dàng trình diễn mã sau này, chúng tôi trích xuất một phương thức có thể truyền một chuỗi và trả về một chuỗi không rỗng.
public String nullToString(String value) {
    return value == null ? "" : value;
}

1. String.concat()

String.concat() là một phương thức đi kèm với lớp String . Nó rất thuận tiện cho việc nối chuỗi.
for (String value : values) {
    result = result.concat(getNonNullString(value));
}
Vì phương thức nullToString() được gọi nên kết quả là không có giá trị null .

2.StringBuilder

Lớp StringBuilder cung cấp nhiều phương thức hữu ích và thuận tiện để xây dựng chuỗi. Phương thức được sử dụng phổ biến nhất trong số đó là phương thứcappend() , phương thức này sử dụngappend() để nối các chuỗi và được kết hợp với phương thức nullToString() để tránh các giá trị null .
String[] values = {"https", "://", "gist.", "github", ".com", null};
StringBuilder result = new StringBuilder();

for (String value : values) {
    result = result.append(nullToString(value));
}
Kết quả là, bạn có thể nhận được kết quả sau:
https://Gist.github.com

3. Lớp StringJoiner (Java 8+)

Lớp StringJoiner cung cấp một hàm mạnh hơn để nối các chuỗi. Nó không chỉ có thể chỉ định dấu phân cách trong quá trình nối mà còn chỉ định tiền tố và hậu tố. Khi nối chuỗi, chúng ta có thể sử dụng phương thức add() của nó . Phương thức nullToString() cũng sẽ được sử dụng ở đây để tránh các giá trị null .
String[] values = {"https", "://", "gist.", "github", ".com", null};
StringJoiner result = new StringJoiner("");

for (String value : values) {
    result = result.add(nullToString(value));
}

4. Streams.filter (Java 8+)

API Stream là một lớp hoạt động luồng mạnh mẽ được giới thiệu trong Java 8, có thể thực hiện lọc tiêu chuẩn, khớp, truyền tải, nhóm, thống kê và các hoạt động khác.
  • Bộ lọc hoạt động bộ lọc có thể nhận được chức năng Vị ngữ .
  • Giao diện của hàm Vị ngữ cũng giống như giao diện Hàm đã giới thiệu trước đó.
  • Đây là một giao diện chức năng.
  • Nó có thể nhận tham số chung <T> và giá trị trả về là kiểu Boolean.
  • Vị ngữ thường được sử dụng để lọc dữ liệu .
Vì vậy, chúng ta có thể xác định một Vị ngữ để kiểm tra chuỗi rỗng và chuyển nó đến phương thức filter() từ API Stream. Ngoài ra, bạn có thể sử dụng phương thức Collectors.joining() để nối các chuỗi không rỗng còn lại.
String[] values = {"https", "://", "gist.", "github", ".com", null};

String result = Arrays.stream(values)
    .filter(Objects::nonNull)
    .collect(Collectors.joining());

5. Sử dụng toán tử +

Sử dụng toán tử + cũng có thể giải quyết được vấn đề, nhưng điều đó không được khuyến khích. Chúng ta biết rằng String là một đối tượng bất biến. Việc sử dụng dấu + thường tạo ra một đối tượng chuỗi và mỗi lần một chuỗi mới được tạo trong bộ nhớ, do đó mức tiêu thụ hiệu năng của việc sử dụng dấu + để nối chuỗi là rất cao.

Phần kết luận

Bài viết này trình bày một số phương pháp nối chuỗi và xử lý NULL, trong đó các phương pháp khác nhau có thể phù hợp với các tình huống khác nhau. Phân tích cho thấy hiệu suất của StringBuilder là tốt nhất. Nhưng trong điều kiện thực tế, bạn cần kết hợp một số kịch bản nhất định và sau đó chọn phương pháp ít gây tổn thất hiệu suất nhất.
Bình luận
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION