List<String> list = List.of("MUNI", "VUT", "X");
int count = list.stream()
.filter(s -> s.length() > 1)
.mapToInt(s -> s.length())
.sum();
// count is 7
Anonymní metody, umožňují elegantní zápis pomocí symbolu šipky.
i → i + 1
(Person p) → (p.getAge() >= 18)
true
, je-li osoba dospěláStream
Proud (java.util.stream.Stream
)
je homogenní lineární struktura prvků (např. seznam).
existují 2 typy operací:
Neplést jsi se vstupně/výstupními proudy (java.io.InputStream /OutputStream )
|
List<String> list = List.of("MUNI", "VUT", "X");
int count = list.stream()
.filter(s -> s.length() > 1)
.mapToInt(s -> s.length())
.sum();
// count is 7
Stream
Stream
obvykle vytváříme z prvků kolekce, pole, nebo vyjmenováním.
Stream<String> stringStream;
List<String> names = new ArrayList<>();
stringStream = names.stream();
String[] names = new String[] { "A", "B" };
stringStream = Stream.of(names);
stringStream = Stream.of("C", "D", "E");
Lambda výraz, který pouze volá metodu, se dá zkrátit vytvořením odkazu na (danou) metodu.
s → s.length()
:String::length
s → System.out.println(s)
:System.out::println
Stream
List<String> names = ...
names.stream()
.map(String::toUpperCase)
.forEach(System.out::println);
toUpperCase
(průběžná operace)
Odpovídá sekvenční iteraci:
for(String name : names) {
System.out.println(name.toUpperCase());
}
Stream
IPřechodné metody vrací proud, na který aplikují omezení:
Stream<T> distinct()
equals
)
Stream<T> limit(long maxSize)
maxSize
prvků
Stream<T> skip(long n)
n
prvků
Stream<T> sorted()
Stream
II
Stream<T> filter(Predicate<? super T> predicate)
Predicate
= lambda výraz s jedním parametrem, vrací booolean
predicate
<R> Stream<R> map(Function<? super T,? extends R> mapper)
mapper
je funkce, která bere prvky typu T
a vrací prvky typu R
map(String::toUpperCase)
existují mapovací funkce mapToInt, mapToLong, mapToDouble
IntStream, ..
average()
Stream
ITerminální anebo ukončovací metody.
long count()
boolean allMatch(Predicate<? super T> predicate)
true
, když všechny prvky splňují daný predikát
boolean anyMatch(Predicate<? super T> predicate)
true
, když alespoň jeden prvek splňuje daný predikát
void forEach(Consumer<? super T> action)
action
na každý prvek prouduforEach(System.out::println)
Stream
II
<A> A[] toArray(IntFunction<A[]> generator)
String[] stringArray = streamString.toArray(String[]::new);
<R,A> R collect(Collector<? super T,A,R> collector)
Collectors
je třída obsahující pouze statické metodystream.collect(Collectors.toList());
stream.collect(Collectors.toCollection(TreeSet::new));
int[] numbers = IntStream.range(0, 10) // 0 to 9
.skip(2) // omit first 2 elements
.limit(5) // take only first 5
.map(x -> 2 * x) // double the values
.toArray(); // make an array [4, 6, 8, 10, 12]
List<String> newList = list.stream()
.distinct() // unique values
.sorted() // ascending order
.collect(Collectors.toList());
Set<String> set = Stream.of("an", "a", "the")
.filter(s -> s.startsWith("a"))
.collect(Collectors.toCollection(TreeSet::new));
// [a, an]
Optional
Optional<T> findFirst()
Optional<T> findAny()
Optional<T> max/min(Comparator<? super T> comparator)
V jazyce Haskell má Optional název Maybe .
|
Optional
Optional<T>
má metody:
boolean isPresent()
— true
, jestli obsahuje hodnotuT get()
— vrátí hodnotu, jestli neexistuje, vyhodí výjimkuT orElse(T other)
— jestli hodnota neexistuje, vrátí other
int result = List.of(1, 2, 3)
.stream()
.filter(num -> num > 4)
.findAny()
.orElse(0);
// result is 0
List<Integer> integerList = List.of(1, 2, 3, 4, 5);
integerList.parallelStream()
.forEach(i -> System.out.print(i + " "));
// 3 5 4 2 1
List<Integer> integerList = List.of(1, 2, 3, 4, 5);
integerList.stream()
.forEach(i -> System.out.print(i + " "));
// 1 2 3 4 5
Jak konvertovat následující kód na proud?
Set<Person> owners = new HashSet<>();
for (Car c : cars) {
owners.add(c.getOwner());
}
Hint x → x.getOwner()
se dá zkrátit na Car::getOwner
.
Set<Person> owners = cars.stream()
.map(Car::getOwner)
.collect(Collectors.toSet());
Jak konvertovat následující kód na proud?
Set<Person> owners = new HashSet<>();
for (Car c : cars) {
if (c.hasExpiredTicket()) owners.add(c.getOwner());
}
Set<Person> owners =
cars.stream()
.filter(c -> c.hasExpiredTicket())
.map(Car::getOwner)
.collect(Collectors.toSet());
java.util.functions
většinou jako generická (typově parametrizovaná) rozhraní, např.:
s jednou metodou boolean test(T t)
s jednou metodou void get(T t)
s jednou metodou void accept(T t)
/