Lambda
Nếu bạn hoàn toàn không biết lambda là gì thì: Lambda trông như thế này:(a, b) -> a.compareTo(b)
(переменные) -> действие
Bây giờ thế là đủ rồi. Bạn có thể đọc lý thuyết ở đây: liên kết một , liên kết hai , nhưng tôi nghĩ thực hành sẽ thú vị hơn nhiều. Tôi đề nghị bạn giải quyết vấn đề sau: Viết máy tính bằng phương pháp 1. Phương thức phải chấp nhận 2 giá trị kỹ thuật số và một số giá trị khác. Mã của bạn sẽ trông giống như thế này:
class Lambda{
public static void main (String[] args) {
}
public static double calculate(){
return null;
}
}
Bạn cần nhập 3 tham số vào chữ ký phương thức calculate
, thêm 1 lệnh vào return
và thử gọi phương thức này trong main
. Phương pháp này có thể làm gì?
- nếp gấp;
- nhân;
- chia;
- trừ;
- tính toán gốc;
- nâng lên quyền lực;
- nâng lũy thừa tổng các đối số chia cho số đầu tiên + 117;
- và tất cả các hoạt động khác mà bạn có thể nghĩ đến.
if-else
;char
như một chỉ báo hoạt động;switch-case
;- và mọi thứ khác xuất hiện trong đầu bạn.
- Chỉ có lambdas thôi, nhiệm vụ thuộc về họ.
inputStream
và không phải vậy OutputStream
. Nó khác, thú vị hơn. Các luồng đã thay thế các chu kỳ, không hoàn toàn, nhưng vẫn vậy. Họ được phục vụ với phương châm “không giải thích cách làm, hãy giải thích phải làm gì”. Một ví dụ nhỏ về luồng:
List<String> myList = Arrays.asList("a1", "a2", "b1", "c2", "c1");
myList.stream()
.filter(s -> s.startsWith("c"))
.map(String::toUpperCase)
.sorted()
.forEach(System.out::println);
Những gì đang xảy ra ở đây? Hãy thêm ý kiến:
myList.stream() // получить поток
.filter(s -> s.startsWith("c")) //отфильтровать значения, оставить те, что начинаются с «с»
.map(String::toUpperCase) // преобразовать все значения, перевести в верхний регистр
.sorted() // отсортировать по порядку (дефолтный порядо)
.forEach(System.out::println); // вывести каждый элемент на экран
So sánh với vòng lặp thông thường:
List<String> toSort = new ArrayList<>();
for(String s : myList){
if(s.startsWith("c")){
toSort.add(s.toUpperCase());
}
}
Collections.sort(toSort);
for(String s : toSort){
System.ouy.println(s);
}
Khi bạn đọc mã, mọi thứ trông thật đáng sợ, nhưng việc bình luận có dễ dàng hơn không? Điều này là bình thường, tôi cũng đã không hiểu chúng từ lâu rồi. Chìa khóa của sự hiểu biết là thực hành. Do đó, chúng tôi bắt đầu đọc các bài viết của bên thứ ba và tìm kiếm câu trả lời cho câu hỏi của mình, bạn cũng có thể hỏi họ ở đây trong phần bình luận, tôi sẽ không đưa ra câu trả lời đầy đủ nhưng tôi sẽ chỉ hướng. Danh sách các tác vụ từ JavaRush mà tôi nghĩ là rất phù hợp để thực hành phát trực tuyến:
-
2208 - có thể được giải bằng 1 luồng và 1 trả về, tức là. phần thân của phương thức sẽ bắt đầu bằng
return
và sau đó sẽ có toàn bộ 1 luồng. Hãy bỏ qua yêu cầuStringBuilder
. -
1908 - bạn cũng có thể giải quyết bằng 1 luồng và 1 trả về. Bắt đầu bằng việc đọc tập tin. Tôi không biết cách ghi vào tệp qua luồng (nếu có thể), trong khi chúng tôi thực hiện thủ công. Những thứ kia. Chúng tôi chỉ mở 2 luồng (bảng điều khiển và ghi vào tệp). Chúng tôi đọc tệp thông qua các phương thức sẽ trả về cho chúng tôi một trang tính hoặc một luồng (google và javadoc).
-
1907 - về lý thuyết, nó cũng có thể được giải trong một luồng. Đầu vào của luồng là tên tệp, đầu ra là số lượng từ trên thế giới.
-
1016 - hơi biến thái, bạn có thể giải 1 luồng và 1 lượt về;
-
1821 - rất dễ dàng và trong 1 luồng và 1 lần quay lại.
2 nhiệm vụ này sẽ giới thiệu cho bạn một phương thức phát trực tuyến khác và một bộ sưu tập khác.
-
1925 - bạn có thể lấy một dòng chứa các từ trong một luồng và sau đó ghi nó vào một tệp (Tôi không biết liệu có thể ghi vào tệp từ một luồng hay không)
GO TO FULL VERSION