Funkcijska sučelja: često korištena za modeliranje objekata koji obavljaju određene poslove Anotirana su s @FunctionalInterface; signaliziraju da se ta sučelja mogu koristiti za stvaranje objekata u lambda-izrazima (ali baš kao i s @Override, ta anotacija nije nužna već se koristi u dokumentacijske svrhe. Pregled funkcijskih sučelja: https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/util/function/packagesummary.html Model obrade: objekt dobiva podatak koji dalje samostalno obrađuje Consumer<T> void accept(t t BiConsumer<T,U> void accept(t t, U u DoubleConsumer void accept(double value IntConsumer void accept(int value LongConsumer void accept(long value Consumer<String> c1 = t->system.out.println(t; Consumer<String> c2 = System.out::println;
Model ispitnog predikata: objekt dobiva podatak za koji treba reći je li prihvatljiv Predicate<T> boolean test(t t BiPredicate<T,U> boolean test(t t, U u DoublePredicate boolean test(double value IntPredicate boolean test(int value LongPredicate boolean test(long value Predicate<String> p1 = t -> t.length(>3; Predicate<String> p2 = t ->!t.isempty(; Predicate<String> p3 = String::isEmpty; Predicate<Integer> p4 = t -> t%3 == 0;
Model preslikavanja: objekt dobiva podatak jednog tipa i transformira ga u novi podatak, moguće drugog tipa Function<T,R> R apply(t t BiFunction<T,U,R> R apply(t t, U u DoubleFunction<R> R apply(double t IntFunction<R> R apply(int t LongFunction<R> R apply(long t ToIntFunction<T> int applyasint(t value ToLongFunction<T> long applyaslong(t value ToDoubleFunction<T> double applyasdouble(t value ToIntBiFunction<T,U> int applyasint(t t, U u ToLongBiFunction<T,U> long applyaslong(t t, U u ToDoubleBiFunction<T,U> double applyasdouble(t t, U u Function<String,Integer> f1 = s -> Integer.valueOf(s; Function<String,Integer> f2 = Integer::valueOf; Function<Integer,String> f3 = i -> i.tostring(; Function<Integer,String> f4 = Integer::toString; Function<Student,Integer> f5 = s -> s.getocjena(; Function<Student,Integer> f6 = Student::getOcjena;
Operatori: objekti koji rade preslikavanje nad istom domenom Unarni: funkcija T T Binarni: funkcija TxT T BinaryOperator<T> extends BiFunction<T,T,T> T apply(t t, T u UnaryOperator<T> extends Function<T,T> T apply(t t DoubleUnaryOperator double applyasdouble(double operand IntUnaryOperator int applyasint(int operand LongUnaryOperator long applyaslong(long operand DoubleBinaryOperator double applyasdouble(double left, double right IntBinaryOperator int applyasint(int left, int right LongBinaryOperator long applyaslong(long left, long right BinaryOperator<Integer> suma = (left,right -> left+right; UnaryOperator<Integer> povecaj = t -> t+1;
Primjene: Iterabilni objekti (npr. kolekcije jednostavnih vrijednosti imaju foreach: Iterable<T> default void foreach(consumer<? super T> action List<String> imena = popuni(; imena.foreach(ime -> System.out.println(ime; imena.foreach(system.out::println; Kolekcije jednostavnih vrijednosti imaju removeif: Collection<E> default boolean removeif(predicate<? super E> filter List<String> imena = popuni(; imena.removeif(ime -> ime.length(<3; // Ovo gore je pokrata za: Iterator<String> it = imena.iterator(; while(it.hasnext( { String ime = it.next(; if(ime.length(<3 it.remove(; Mape imaju foreach: Map<K,V> default void foreach(biconsumer<? super K,? super V> action Map<String,Integer> ocjene = popuni(; ocjene.foreach( (ime,ocjena -> System.out.printf("%s %d",ime,ocjena ;
Mape imaju replaceall: Map<K,V> default void replaceall(bifunction<? super K,? super V,? extends V> function Map<String,Integer> ocjene = popuni(; ocjene.replaceall( (ime,ocjena -> ime.length(<3? ocjena-1 : ocjena+1 ; Mape imaju compute: Map<K,V> default V compute( K key, BiFunction<? super K,? super V,? extends V> remappingfunction - na par (key,value iz mape primijeni remapping funkciju koja treba vratiti novu vrijednost - ako je nova vrijednost null, ako je par postojao, briše se iz mape - ako je nova vrijednost različita od null, par se ažurira tom novom vrijednosti - pozivatelju se vraća nova vrijednost Map<Object,String> map = Object key = String msg = "Pero"; String r = map.compute(key, (k,v-> v==null? msg : v.concat(msg int novi = brojpojava.compute(ime, (i,b -> b==null? 1 : b+1
Mape imaju merge: Map<K,V> default V merge( K key, V value, BiFunction<? super V,? super V,? extends V> remappingfunction - ako mapa nema par s predanim ključem, ili je u njemu vrijednost null, dodaj/ažuriraj par tako da vrijednost bude predana (drugi argument - ako u mapi postoji par s predanim ključem i vrijednost nije null, ažuriraj vrijednost tako da odgovara rezultatu primjene bifunkcije na vrijednost zapisanu u mapi i vrijednost predanu kao drugi argument - ako remappling funkcija vrati null, par se uklanja iz mape map.merge(key, msg, String::concat map.merge( ime, msg, (old, init -> old.concat(init map.merge( ime, msg, new BiFunction<String,String,String>( { public String apply(string old, String init { return old.concat(init;
brojpojava.merge(ime, 1, (old,init -> old+init brojpojava.merge(ime, 1, (old,init -> old+1 brojpojava.merge(ime, 1, Integer::sum brojpojava.merge( ime, 1, (old, init -> old+init brojpojava.merge( ime, 1, new BiFunction<Integer,Integer,Integer>( { public Integer apply(integer old, Integer init { return old+init;