Programowanie w języku Java...
Transcript of Programowanie w języku Java...
Programowanie w języku Java
WYKŁAD
dr inż. Piotr Zabawa
Certyfikowany Konsultant IBM/Rational
e-mail: [email protected]
www: http://www.pk.edu.pl/~pzabawa 31.03.2014
Zakład Inżynierii Oprogramowania
WYKŁAD 6Operacje we/wy
dr inż. Piotr Zabawa Instytut Informatyki Wydział Fizyki, Matematyki i Informatyki
Zakład Inżynierii Oprogramowania
Operacje we/wy
Biblioteki standardowe ze strumieniami:
• java.io
• java.nio
oraz zmiany wprowadzone w ramach Java 8.
dr inż. Piotr Zabawa Instytut Informatyki Wydział Fizyki, Matematyki i Informatyki
Zakład Inżynierii Oprogramowania
Operacje we/wy
Ze względu na dużą różnorodność klas w bibliotekach we/wy
intensywnie wykorzystywany jest wzorzec projektowy Dekorator.
Pozwala on na składanie obiektów tej biblioteki w ogromnej ilości
kombinacji. Zostanie to zilustrowane przykładami.
dr inż. Piotr Zabawa Instytut Informatyki Wydział Fizyki, Matematyki i Informatyki
Zakład Inżynierii Oprogramowania
Operacje we/wy
Strumień jest pojęciem abstrakcyjnym mającym następujące cechy:
• strumień związany jest ze źródłem lub odbiornikiem danych
• źródło lub odbiornik mogą być dowolne: plik, pamięć, URL, gniazdo, potok ...
• strumień służy do zapisywania-odczytywania informacji - dowolnych danych
• program: kojarzy strumień z zewnętrznym źródłem/odbiornikiem,
– otwiera strumień,
– dodaje lub pobiera dane ze strumienia,
– zamyka strumień.
• przy czytaniu lub zapisie danych z/do strumienia mogą być wykonywane
dodatkowe operacje (np. buforowanie, kodowanie-dekodowanie, kompresja-
dekompresja)
• w Javie dostarczono klas, reprezentujących strumienie. Hierarchia tych klas
pozwala na programowanie w sposób abstrahujący od konkretnych źródeł i
odbiorników.dr inż. Piotr Zabawa Instytut Informatyki Wydział Fizyki, Matematyki i Informatyki
Zakład Inżynierii Oprogramowania
Operacje we/wy
Wprowadzono w bibliotece we/wy różne rodzaje klas i interfejsów:
• Strumieniowe
• Dodatkowe
dr inż. Piotr Zabawa Instytut Informatyki Wydział Fizyki, Matematyki i Informatyki
Zakład Inżynierii Oprogramowania
Operacje we/wy
Kierunki operacji strumieniowych:
• Wejściowe
• Wyjściowe
Rodzaje strumieni:
• Bajtowe (1 bajt)
• Znakowe (2 bajty, bo Unicode)
Dodatkowe zagadnienia:
• Serializacja
• Operacje na plikach
dr inż. Piotr Zabawa Instytut Informatyki Wydział Fizyki, Matematyki i Informatyki
Zakład Inżynierii Oprogramowania
Operacje we/wy
dr inż. Piotr Zabawa Instytut Informatyki Wydział Fizyki, Matematyki i Informatyki
Zakład Inżynierii Oprogramowania
Wejście Wyjście
Strumienie bajtowe InputStream OutputStream
Strumienie znakowe Reader Writer
Wierzchołek hierarchii klas strumieniowych przedstawiono w tabelce
poniżej.
Te abstrakcyjne klasy oferują podstawowe funkcjonalności:
• read()
• write()
• skip(), mark(), reset()
• close()
Operacje we/wy
Strumienie:
• Bajtowe: (Stream)
– Wejściowe (InputStream, FilterInputStream,...)
– Wyjściowe (OutputStream, FilterOutputStream,...)
• Znakowe (Reader, Writer)
– Wejściowe (InputStreamReader,...)
– Wyjściowe (OutputStreamReader,...)
dr inż. Piotr Zabawa Instytut Informatyki Wydział Fizyki, Matematyki i Informatyki
Zakład Inżynierii Oprogramowania
Operacje we/wy - klasy przedmiotoweStrumieniom trzeba prędzej czy później wskazać konkretne źródło lub
odbiornik. Można je sklasyfikować następująco – klasy przedmiotowe:
dr inż. Piotr Zabawa Instytut Informatyki Wydział Fizyki, Matematyki i Informatyki
Zakład Inżynierii Oprogramowania
Źródło/odbiornik Strumienie bajtowe Strumienie znakowe
Pamięć ByteArrayInputStream,
ByteArrayOutputStream
CharArrayReader,
CharArrayWriter
StringBufferInputStream StringReader,
StringWriter
Potok PipedInputStream,
PipedOutputStream
PipedReader,
PipedWriter
FileReader,
FileWriter
- FileInputStream,
FileOutputStream
Klasy przedmiotowe mogą dotyczyć innych zasobów – są dostępne w
innych pakietach, np. sieciowych.
Operacje we/wy - klasy
przetwarzająceW czasie wykonywania operacji na strumieniach mogą być
wykonywane dodatkowe operacje wzbogacające funkcjonalność
dotychczasowych klas o dodatkowe zobowiązania.
dr inż. Piotr Zabawa Instytut Informatyki Wydział Fizyki, Matematyki i Informatyki
Zakład Inżynierii Oprogramowania
dr inż. Piotr Zabawa Instytut Informatyki Wydział Fizyki, Matematyki i Informatyki
Zakład Inżynierii Oprogramowania
Rodzaj przetwarzania Strumienie bajtowe Strumienie znakowe
Buforowanie BufferedInputStream,
BufferedOutputStream
BufferedReader,
BufferedWriter
Filtrowanie FilterInputStream,
FilterOutputStream
FilterReader,
FilterWriter
Konwersja: bajty-znaki InputStreamReader,
OutputStreamWriter
Konkatenacja SequenceInputStream
Serializacja obiektów ObjectInputStream,
ObjectOutputStream
Konwersje danych DataInputStream,
DataOutputStream
Zliczanie wierszy LineNumberInputStream LineNumberReader
Podglądanie PushbackInputStream PushbackReader
Drukowanie PrintStream PrintWriter
Operacje we/wy – strumienie bajtowe
Strumienie bajtowe traktują dane jak zbiór ośmiobitowych bajtów.
Wszystke strumienie bajtowe dziedziczą z klas:
• InputStream (dane przychodzące do programu)
lub
• OutputStream (dane wychodzące z programu).
Strumienie zawsze należy zamykać!
Strumienie bajtowe reprezentują “niskopoziomowy” dostęp do danych.
dr inż. Piotr Zabawa Instytut Informatyki Wydział Fizyki, Matematyki i Informatyki
Zakład Inżynierii Oprogramowania
Operacje we/wy – strumienie bajtowe
Szczególnym rodzajem strumieni bajtowych są strumienie binarne -
koniec strumienia rozpoznaje się jako wyjątek EOFException.
Klasyfikacja strumieni binarnych:
• strumienie danych (zapis/odczyt surowych danych)
– DataInputStream
– DataOutputStream
• strumienie obiektowe (serializacja/deserializacja obiektów)
– ObjectInputStream
– ObjectOutputStream
dr inż. Piotr Zabawa Instytut Informatyki Wydział Fizyki, Matematyki i Informatyki
Zakład Inżynierii Oprogramowania
Operacje we/wy – strumienie bajtowe
Strumienie bajtowe wejściowe
• InputStream – przodek hierarchii, istotne metody: int read(), int read(byte[]),
int read(byte[], int, int)
• PipedInputStream – służy do komunikacji wewnątrz programu
• ByteArrayInputStream – strumień czytający z tablicy
• FilterInputStream – przodek strumieni wprowadzających dodatkową
funkcjonalność
• DataInputStream – operujące na typach prymitywnych
• BufferedInputStream – strumień buforowany
• GZIPInputStream – strumień dekompresujący w locie dane przez niego
przechodzące
• SequenceInputStream – skleja kolejne strumienie
dr inż. Piotr Zabawa Instytut Informatyki Wydział Fizyki, Matematyki i Informatyki
Zakład Inżynierii Oprogramowania
Operacje we/wy – strumienie bajtowe
Strumienie bajtowe wyjściowe
• OutputStream – przodek hierarchii, istotne metody: write(int), write(byte[]),
write(byte[],int,int)
• PipedOutputStream – służy do komunikacji wewnątrz programu
• ByteArrayOutputStream – strumień piszący do tablicy
• FilterOutputStream – przodek strumieni wprowadzających dodatkową
funkcjonalność
• DataOutputStream – operujące na typach prymitywnych
• BufferedOutputStream – strumień buforowany
• GZIPOutputStream – strumień kompresujący w locie dane przez niego
przechodzące
• FileOutputStream – strumień piszący do pliku
dr inż. Piotr Zabawa Instytut Informatyki Wydział Fizyki, Matematyki i Informatyki
Zakład Inżynierii Oprogramowania
Operacje we/wy – strumienie bajtowe
Klasy buforowanych strumieni bajtowych:
• BufferedInputStream
• BufferedOutputStream
Pozwalają one na zapis/odczyt całymi liniami (buforowanie).
dr inż. Piotr Zabawa Instytut Informatyki Wydział Fizyki, Matematyki i Informatyki
Zakład Inżynierii Oprogramowania
Operacje we/wy - strumienie znakowe
Strumienie znakowe automatycznie konwertują dane tekstowe do stosowanego
natywnie w Java formatu Unicode. Konwersja jest dokonywana w oparciu o
ustawienia regionalne komputera, na którym uruchomiono JVM (Wirtualną
Maszynę Javy) lub jest oprogramowana przez programistę.
Strumienie znakowe dziedziczą z klas:
• Reader (dane przychodzące do programu)
lub
• Writer (dane wychodzące z programu).
dr inż. Piotr Zabawa Instytut Informatyki Wydział Fizyki, Matematyki i Informatyki
Zakład Inżynierii Oprogramowania
Operacje we/wy - strumienie znakowe
Strumienie znakowe wejściowe
• Reader – przodek hierarchii; istotne metody: write(int), write(byte[]),
write(byte[],int,int)
• BufferedReader – buforowany strumień znakowy: podstawowa metoda –
String readLine()
• LineNumberReader – strumień zliczający numery linii
• CharArrayReader – strumień piszący do tablicy znaków
• PipedReader – analogiczny do PipedOutputStream
• InputStreamReader – połączenie strumienie znakowych i bajtowych
• FileReader – strumień skierowany do pliku
dr inż. Piotr Zabawa Instytut Informatyki Wydział Fizyki, Matematyki i Informatyki
Zakład Inżynierii Oprogramowania
Operacje we/wy - strumienie znakowe
Strumienie znakowe wyjściowe
• Writer – przodek hierarchii; istotne metody: write(int), write(char[]),
write(String)
• BufferedWriter – buforowany strumień znakowy
• CharArrayWriter – strumień piszący do tablicy znaków
• PipedWriter – analogiczny do PipedOutputStream
• OutputStreamWriter – połączenie strumienie znakowych i bajtowych
• FileWriter – strumień skierowany do pliku
• PrintWriter – podobny do PrintOutputStream, ale nie dysponuje metodami do
obsługi byte[]
dr inż. Piotr Zabawa Instytut Informatyki Wydział Fizyki, Matematyki i Informatyki
Zakład Inżynierii Oprogramowania
Operacje we/wy - strumienie znakowe
Klasy buforowanych strumieni znakowych:
• BufferedReader
• BufferedWriter
Pozwalają one na zapis/odczyt całymi liniami (buforowanie).
dr inż. Piotr Zabawa Instytut Informatyki Wydział Fizyki, Matematyki i Informatyki
Zakład Inżynierii Oprogramowania
Operacje we/wy - strumienie znakowe
Przykłady:
• Stdin
String s;
BufferedReader br = new BufferedReader(
new InputStreamReader(System.in));
while ( (s = br.readLine()) != null ) {
System.out.println(s);
}
Strumienie znakowe buforowane umożliwiają odczytywanie tekstu
wierszami.
dr inż. Piotr Zabawa Instytut Informatyki Wydział Fizyki, Matematyki i Informatyki
Zakład Inżynierii Oprogramowania
Operacje we/wy - strumienie znakowe
• Stdout
String fname = "c:\\data\\output.txt";
Writer writer = new OutputStreamWriter(new
FileOutputStream(fname));
writer.write("Hello World");
writer.close();
dr inż. Piotr Zabawa Instytut Informatyki Wydział Fizyki, Matematyki i Informatyki
Zakład Inżynierii Oprogramowania
Operacje we/wy - strumienie znakowe
Przykład dekorowania:
String s;
BufferedReader br = new BufferedReader(
new InputStreamReader(
new GZIPInputStream(
new FileInputStream(
new File(“data.txt.gz”)))));
while ( (s = br.readLine()) != null ) {
System.out.println(s);
}
dr inż. Piotr Zabawa Instytut Informatyki Wydział Fizyki, Matematyki i Informatyki
Zakład Inżynierii Oprogramowania
Operacje we/wy
Strumienie działające na plikach:
• FileInputStream
• FileOutputStream
• FileReader
• FileWriter
dr inż. Piotr Zabawa Instytut Informatyki Wydział Fizyki, Matematyki i Informatyki
Zakład Inżynierii Oprogramowania
Operacje we/wy
Znaczenie klasy File – operacje na plikach i na katalogach.
Problem rekurencyjnego nawigowania po systemie plików.
dr inż. Piotr Zabawa Instytut Informatyki Wydział Fizyki, Matematyki i Informatyki
Zakład Inżynierii Oprogramowania
Operacje we/wy
Pliki o dostępie swobodnym:
RandomAccessFile
Nie są one strumieniami i nie należą do omawianej hierarchii.
dr inż. Piotr Zabawa Instytut Informatyki Wydział Fizyki, Matematyki i Informatyki
Zakład Inżynierii Oprogramowania
Operacje we/wy
Zastosowania serializacji:
• komunikacja pomiędzy obiektami/aplikacjami poprzez gniazdka
(sockets),
• zachowanie obiektu (jego stanu i właściwości) do późniejszego
odtworzenia i wykorzystania przez tę samą lub inną aplikację.
Ma zastosowanie w aplikacjach korporacyjnych.
W czasie serializacji zapisywany jest rekurencyjnie stan obiektów
składowych, jednak pod warunkiem, że implementują one interfejs
Serializable.
dr inż. Piotr Zabawa Instytut Informatyki Wydział Fizyki, Matematyki i Informatyki
Zakład Inżynierii Oprogramowania
Operacje we/wy
Serializacja związana jest ze strumieniami obiektowymi.
Klasa serializowana musi implementować interfejs Serializable. Jeśli
w trakcie serializacji/deserializacji trzeba wykonać nietypowe operacje, to
należy zaimplementować metody:
private void writeObject(java.io.ObjectOutputStream out)
throws IOException;
private void readObject(java.io.ObjectInputStream in)
throws IOException, ClassNotFoundException;
dr inż. Piotr Zabawa Instytut Informatyki Wydział Fizyki, Matematyki i Informatyki
Zakład Inżynierii Oprogramowania
Operacje we/wy
• przy serializacji nie są zapisywane pola statyczne oraz pola
deklarowane ze specyfikatorem transient; specyfikatora transient
używamy więc wobec elementów informacji o obiekcie, których nie
chcemy poddawać utrwaleniu.
• pełniejszą kontrolę nad sposobem serializacji możemy zyskać
definiując odpowiednie metody w klasie obiektu serializowanegoo,
metody te winny mieć następujące sygnatury:
• całkowitą kontrolę nad formatem i sposobem serializacji zyskujemy
poprzez implementację w klasie interfejsu Externalizable i
dostarczenie metod writeExternal i readExternal
dr inż. Piotr Zabawa Instytut Informatyki Wydział Fizyki, Matematyki i Informatyki
Zakład Inżynierii Oprogramowania
Operacje we/wy
Serializacja i deserializacja
// serializacja
class X implements Serializable {
int i;
}
ObjectOutputStream s = new ObjectOutputStream( new
FileOutputStream("data.dat"));
s.writeObject("Today");
s.writeObject(new Date());
s.writeObject(new X());
s.flush();
dr inż. Piotr Zabawa Instytut Informatyki Wydział Fizyki, Matematyki i Informatyki
Zakład Inżynierii Oprogramowania
Operacje we/wy
// deserializacja
ObjectInputStream s = new ObjectInputStream( new
FileInputStream("data.dat"));
String today = (String)s.readObject();
Date date = (Date)s.readObject();
X x = (X) s.readObject();
dr inż. Piotr Zabawa Instytut Informatyki Wydział Fizyki, Matematyki i Informatyki
Zakład Inżynierii Oprogramowania
Operacje we/wy
Dla obiektów typu JavaBeans istnieje także możliwość serializacji tekstowej
(do plików w formacie XML) z wykorzystaniem klas XMLEncoder i
XMLDecoder.
dr inż. Piotr Zabawa Instytut Informatyki Wydział Fizyki, Matematyki i Informatyki
Zakład Inżynierii Oprogramowania
Operacje we/wy
Potoki.
Służą one do przesyłania danych pomiędzy równolegle działającymi
wątkami.
O wielowątkowości w Java będziemy mówili na jednym z dalszych
wykładów.
Na następnych dwóch slajdach – przykład komunikacji między dwoma
obiektami-wątkami.
dr inż. Piotr Zabawa Instytut Informatyki Wydział Fizyki, Matematyki i Informatyki
Zakład Inżynierii Oprogramowania
Operacje we/wy
class DataPutter extends Thread {
OutputStream out;
public DataPutter(OutputStream o) {
out = o;
}
public void run() {
try {
for (char c = 'a'; c <= 'z'; c++)
out.write(c);
out.close();
}
catch(IOException exc) {
return;
}
}
}
dr inż. Piotr Zabawa Instytut Informatyki Wydział Fizyki, Matematyki i Informatyki
Zakład Inżynierii Oprogramowania
Operacje we/wy
class DataGetter extends Thread {
InputStream in;
public DataGetter(InputStream i) {
in = i;
}
public void run() {
try {
int c;
while ((c = in.read()) != -1) System.out.println((char) c);
}
catch(IOException exc) {
return;
}
}
}
dr inż. Piotr Zabawa Instytut Informatyki Wydział Fizyki, Matematyki i Informatyki
Zakład Inżynierii Oprogramowania
Operacje we/wy
Dodatkowe usługi związane ze strumieniami w pakiecie:
• java.util
Obejmują one:
• java.util.Scanner
• java.util.Formatter
• java.util.Locale
• java.util.ResourceBundle
dr inż. Piotr Zabawa Instytut Informatyki Wydział Fizyki, Matematyki i Informatyki
Zakład Inżynierii Oprogramowania
Operacje we/wy
Nowa biblioteka (od Java 1.7) we/wy:
• java.nio
Wprowadzono w niej nieblokujące operacje we/wy. Operacje
oferowane przez tę bibliotekę są znacznie szybsze niż przez java.io.
Zawiera ona następujące elementy:
• Buffers – kontenery danych (także: mapowane do pamięci)
• Channels – mechanizmy operowania na danych
• Selectors – mechanizmy wybierania kanałów dostępnych (gotowych
do operacji we/wy)
dr inż. Piotr Zabawa Instytut Informatyki Wydział Fizyki, Matematyki i Informatyki
Zakład Inżynierii Oprogramowania
Operacje we/wy
Działania na plikach:
• Pakiet java.nio.file
• Interfejs Path – reprezentuje pliki i katalogi
• Klasa Files – operacje na plikach
Obsługuje:
• Strumienie bajtowe
• Kanały
• Swobodny dostęp do plików za pomocą kanałów i interfejsu
SeekableByteChannel
• Mapowanie kanałów na pamięć – błyskawiczne operacje na plikach
dr inż. Piotr Zabawa Instytut Informatyki Wydział Fizyki, Matematyki i Informatyki
Zakład Inżynierii Oprogramowania
Operacje we/wy
Archiwa JAR – możliwość kompresji, umieszczania w nich klas,
cyfrowego podpisywania,…:
• JarOutputStream
• JarInputStream
Sposób tworzenia archiwum z linii komend:
jar cf archiwum.jar klasa1.class klasa2.class ...
c – tworzenie pliku (create),
f – zawartość archiwum zostanie zapisana do pliku archiwum.jar
m – do archiwum zostanie dołączony plik manifest z określonej
lokalizacji, np: jar cmf plik_manifest archiwum.jar *,
dr inż. Piotr Zabawa Instytut Informatyki Wydział Fizyki, Matematyki i Informatyki
Zakład Inżynierii Oprogramowania
Operacje we/wy
W archiwum jar znajduje się katalog META-INF a w nim plik
MANIFEST.MF zawierający dodatkowe informacje o archiwum.
Przykładowa zawartość:
Manifest-Version: 1.0
Created-By: 1.5.0-b64 (Sun Microsystems Inc.)
Ant-Version: Apache Ant 1.6.5
Main-Class: pl.edu.pk.jp.RunnerClass
mówi, że po uruchomieniu archiwum wykonana zostanie metoda
main(String[] args) zawarta w klasie RunnerClass znajdującej się w
pakiecie pl.edu.pk.jp.
Uruchomienie pliku jar:
java -jar archiwum.jar
dr inż. Piotr Zabawa Instytut Informatyki Wydział Fizyki, Matematyki i Informatyki
Zakład Inżynierii Oprogramowania
Java 8
dr inż. Piotr Zabawa Instytut Informatyki Wydział Fizyki, Matematyki i Informatyki
Zakład Inżynierii Oprogramowania
Java 8 – Stream API
Ze względu na wzrost znaczenia możliwości sprzętowych
oferowanych przez współczesne mikroprocesory postanowiono położyć
nacisk na równoległość przetwarzania:
• Pracowano nad opartym na Javie systemie operacyjnym czasu
rzeczywistego
• Wprowadzano w Java implementację wielowątkowości – Fork Join
Framework (FJF)
• Implementowano biblioteki standardowe Java opierając je o FJF
Przykładem takiej biblioteki jest właśnie Java 8 Stream API.
Skoncentrowano się w niej na przetwarzaniu danych w sposób abstrakcyjny
zwalniając tym samym programistę od konieczności oprogramowania
niskopoziomowej logiki wielowątkowej.
dr inż. Piotr Zabawa Instytut Informatyki Wydział Fizyki, Matematyki i Informatyki
Zakład Inżynierii Oprogramowania
Java 8 – Stream API
Kolekcje a strumienie:
• Kolekcje – predefiniowane struktury danych w pamięci zawierające
elementy wyliczane przed umieszczeniem ich w kolekcji
• Strumienie – ustalone struktury danych wyliczające elementy na
żądanie
Strumienie w Java 8 można postrzegać jako leniwie konstruowane
kolekcje , w których wartości elementów wyznaczane są na żądanie
użytkownika. Odwrotnie niż w Java 8-.
dr inż. Piotr Zabawa Instytut Informatyki Wydział Fizyki, Matematyki i Informatyki
Zakład Inżynierii Oprogramowania
Java 8 – Stream API
Strumienie w Java 8 zostały zdefiniowane w pakiecie:
• java.util.stream
Kolekcje Java 8 mają dodane metody zwracające Stream. Z punktu
widzenia strumieni źródłem danych dla nich mogą być:
• Kolekcje
• Operacje we/wy
• Tablice
Podobnie jak w przypadku funkcyjnych języków programowania
Strumienie wspierają operacje agregowania – przykłady:
• filter, map, reduce, find, match, sort
Operacje te mogą być wykonywane sekwencyjnie lub równolegle.
dr inż. Piotr Zabawa Instytut Informatyki Wydział Fizyki, Matematyki i Informatyki
Zakład Inżynierii Oprogramowania
Java 8 – Stream API
Dodatkowo strumienie w Java 8 wspierają:
• Pipelining (operacje na strumieniach zwracają strumienie – możliwość
składania operacji)
• Iteracje wewnętrzne
dr inż. Piotr Zabawa Instytut Informatyki Wydział Fizyki, Matematyki i Informatyki
Zakład Inżynierii Oprogramowania
Java 8 – Stream API
Przykład – wyszukanie spośród studentów takich dziesięciu, których
nazwiska zaczynają się od „A‟:
List<String> names = students.stream()
.map(Student::getName)
.filter(name->name.startsWith("A"))
.limit(10)
.collect(Collectors.toList());
Operacje:
• Pośrednie (intermediate) – powyżej map, filter, limit
• Końcowe (terminal)
dr inż. Piotr Zabawa Instytut Informatyki Wydział Fizyki, Matematyki i Informatyki
Zakład Inżynierii Oprogramowania
Java 8 – Stream API
W Java 8 wprowadzono możliwość wykorzystania wyrażeń lambda.
Przykład – stare API.
List<Block> blocks = /* ... */;
int sumOfWeights = 0;
for (Block block : blocks) {
if (block.getColor() == Color.RED) {
sumOfWeights += block.getWeight();
}
}
dr inż. Piotr Zabawa Instytut Informatyki Wydział Fizyki, Matematyki i Informatyki
Zakład Inżynierii Oprogramowania
Java 8 – Stream API
Przykład – nowe API.
List<Block> blocks = /* ... */;
int sumOfWeights = blocks.stream()
.filter(b -> b.getColor() == Color.RED)
.map(b -> b.getWeight())
.sum();
Można spotkać się ze słowami krytyki dotyczącymi braku
bezstanowych wyrażeń lambda w Java 8 negatywnie rzutującymi na
możliwą do uzyskania efektywność operacji strumieniowych.
dr inż. Piotr Zabawa Instytut Informatyki Wydział Fizyki, Matematyki i Informatyki
Zakład Inżynierii Oprogramowania
Operacje we/wy
Używanie standardowej biblioteki we/wy w każdej z postaci wymaga
przechwytywania i obsługi wyjątków po stronie klienta. Dlatego na
kolejnym wykładzie poznamy wyjątki.
W czasie wykorzystywania operacji we/wy na zajęciach polegaliśmy
na mechanizmie generowania obsługi wyjątków oferowanym przez
środowisko deweloperskie.
dr inż. Piotr Zabawa Instytut Informatyki Wydział Fizyki, Matematyki i Informatyki
Zakład Inżynierii Oprogramowania
Koniec
dr inż. Piotr Zabawa Instytut Informatyki Wydział Fizyki, Matematyki i Informatyki
Zakład Inżynierii Oprogramowania