Lambdy
Jeśli w ogóle nie wiesz, czym są lambdy, to: Lambda wygląda następująco:(a, b) -> a.compareTo(b)
(переменные) -> действие
To na razie wystarczy. Teorię możesz przeczytać tutaj: link pierwszy , link drugi , ale myślę, że praktyka jest o wiele zabawniejsza. Sugeruję rozwiązanie następującego problemu: Napisz kalkulator, korzystając z metody 1. Metoda powinna akceptować 2 wartości cyfrowe i coś jeszcze. Twój kod będzie wyglądał mniej więcej tak:
class Lambda{
public static void main (String[] args) {
}
public static double calculate(){
return null;
}
}
Musisz wpisać 3 parametry w sygnaturze metody calculate
, dodać 1 polecenie return
i przetestować wywołanie tej metody w main
. Co powinna potrafić ta metoda?
- zginać;
- zwielokrotniać;
- dzielić;
- odejmować;
- obliczyć pierwiastek;
- podnieść do potęgi;
- podnieś do potęgi sumę argumentów podzieloną przez pierwszą liczbę + 117;
- i wszystkie inne operacje, jakie możesz wymyślić.
if-else
;char
jako wskaźnik działania;switch-case
;- i wszystko inne co przyjdzie Ci do głowy.
- Tylko lambdy, na nich jest zadanie.
inputStream
i nie jest OutputStream
. Jest inaczej, ciekawiej. Strumienie zastąpiły cykle, nie całkowicie, ale jednak. Podaje się je pod hasłem „nie tłumacz, jak to zrobić, wyjaśnij, co robić”. Mały przykład strumienia:
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);
Co tu się dzieje? Dodajmy komentarze:
myList.stream() // получить поток
.filter(s -> s.startsWith("c")) //отфильтровать значения, оставить те, что начинаются с «с»
.map(String::toUpperCase) // преобразовать все значения, перевести в верхний регистр
.sorted() // отсортировать по порядку (дефолтный порядо)
.forEach(System.out::println); // вывести каждый элемент на экран
Porównaj ze zwykłą pętlą:
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);
}
Kiedy czytasz kod, wszystko wygląda przerażająco, ale czy łatwiej jest z komentarzami? To normalne, ja też ich długo nie rozumiałem. Kluczem do zrozumienia jest praktyka. Dlatego zaczynamy czytać artykuły obcych i szukać odpowiedzi na nasze pytania, możesz je zadać również tutaj w komentarzach, nie podam pełnej odpowiedzi, ale wskażę kierunek. Lista zadań z JavaRush, które moim zdaniem świetnie nadają się do ćwiczenia przesyłania strumieniowego:
-
2208 - można rozwiązać za pomocą 1 strumienia i 1 powrotu, tj. treść metody zacznie się od,
return
a następnie będzie 1 cały strumień. Pomińmy to wymaganieStringBuilder
. -
1908 - można to również rozwiązać za pomocą 1 strumienia i 1 powrotu. Zacznij od odczytania pliku. Nie wiem jak nagrać do pliku poprzez strumienie (o ile jest taka możliwość), na razie robimy to ręcznie. Te. Otwieramy tylko 2 strumienie (konsola i zapis do pliku). Odczytujemy plik za pomocą metod, które zwrócą nam arkusz lub strumień (google i javadoc).
-
1907 - teoretycznie da się to też rozwiązać w jednym strumieniu. Dane wejściowe do strumienia to nazwa pliku, wyjście to liczba słów świata.
-
1016 - w nieco przewrotny sposób można to rozwiązać w 1 strumieniu i 1 powrocie;
-
1821 - bardzo łatwo i w 1 strumieniu i 1 powrocie.
Te 2 zadania wprowadzą Cię w inną metodę przesyłania strumieniowego i innego kolekcjonera.
-
1925 - można pobrać linijkę ze słowami w jednym strumieniu i potem zapisać ją do pliku (nie wiem, czy da się zapisać do pliku ze strumienia)
GO TO FULL VERSION