Nothing here yet.
Nothing here yet.
Về chỗ mình bị confuse trong bài, là chỗ method reference tới instance với static method ấy, tóm lại là như này. Với reference tới static method, thì chỉ có match lambda param vào đúng với method param. class Test { public static checkAge ( int age) { return age > 18 ; } } ... // Lambda có 1 param, ứng với checkAge() có 1 param Predicate<Integer> check = Test::checkAge; Nhưng khi reference tới instance method, sẽ có 2 trường hợp sau: Giống như trên, các lambda param tương ứng với các param của instance method Lambda có 1 param, và gọi method trên chính param đó. Method đó lúc này phải không có tham số nào. Lấy ví dụ nhé cho dễ hiểu hai trường hợp trên. // Trường hợp 1 class Test { public int length (String str) { return str.length; } } ... // Trường hợp 1 dùng object bên ngoài // Thì lambda param sẽ đưa vô trong method param luôn Function<String, Integer> getLength = new Test()::length; // Trường hợp 2 dùng tên class của lambda param // Lambda param sẽ làm luôn object, gọi method không có param Function<String, Integer> getLength = String::length; Đấy, đó chính là lý do mình bị confuse (và maybe nhiều bạn cũng thế). Hi vọng Java sẽ bổ sung syntax mới rõ ràng hơn ở chỗ này.
Về phần cách lambda hoạt động mọi người tham khảo thêm ở đây nhé Java 8 Lambdas - A Peek Under the Hood . Thực sự mình không viết ra bài mới do mình viết không hay, cũng không hiểu quá sâu về Java để giải thích chi tiết được. Nói chung thì ý của tác giả là lambda hoạt động bên trong khác với anonymous class. Anonymous class sẽ tạo thêm 1 class ẩn cho từng lambda, lambda thì không như vậy nên hiệu suất sẽ tốt hơn nhiều. Tác giả cũng giải thích các lambda xử lý đối với các capture variable khá kĩ, các bạn nên đọc nhé.