4. ТЕОРИЯ - ЗАМЫКАНИЯ
Lambda expression
– Анонимный метод
– Может обращаться к переменным в локальной области
– Нет лишнего .class при компиляции
(x, y) => { System.out.println("The sum of x and y equals " +
(x+y) )
() => {return outerValue;}
4 Sigma Ukraine
5. ПРИМЕР
error: local variables referenced from a lambda
expression must be final or effectively final
{
String ref = "a";
Runnable r = () -> {ref = "b";};
r.run();
System.out.println(ref);
}
5 Sigma Ukraine
6. ПРИМЕР
{
Runnable r = ()->{System.out.println("hello");};
(new Thread(r)).start();
}
6 Sigma Ukraine
7. ПРИМЕР
{
String ref = "a";
Runnable r = () -> {System.out.println(ref);};
r.run();
System.out.println(ref);
}
7 Sigma Ukraine
8. ПРИМЕР
String ref = "a";
Runnable r = new Runnable(){
public void run(){
System.out.println(ref);
}
};
r.run();
System.out.println(ref);
8 Sigma Ukraine
9. ПРИМЕР
{
List<String> strings = new LinkedList<String>();
Collections.sort(strings, (String a,String b) -> {
return -(a.compareTo(b));
});
}
9 Sigma Ukraine
10. ПРИМЕР
{
List<String> strings = new LinkedList<String>();
Collections.sort(strings, (a, b) -> -(a.compareTo(b)));
}
10 Sigma Ukraine
11. ТЕРИЯ, ИЗМЕНЕНИЯ В ЯЗЫКЕ
Функциональный интерфейс
– “A functional interface is an interface that has just one abstract
method, and thus represents a single function contract. (In some
cases, this "single" method may take the form of multiple
abstract methods with override-equivalent signatures inherited
from superinterfaces; in this case, the inherited methods logically
represent a single method.)” - JSR
Метод по умолчанию
Ссылка на метод
11 Sigma Ukraine
12. ТЕОРИЯ, МЕТОД ПО УМОЛЧАНИЮ
interface A{
void doA();
}
interface B extends A{
default void doB() {
doA();
doA();
}
}
12 Sigma Ukraine
13. ТЕОРИЯ, МЕТОД ПО УМОЛЧАНИЮ
interface A{
void doA();
default void doB() {
doA();
doA();
}
}
13 Sigma Ukraine
14. ТЕОРИЯ, ССЫЛКА НА МЕТОД
“A method reference is used to refer to a method without invoking it;
a constructor reference is similarly used to refer to a constructor without
creating a new instance of the named class or array type.” - JSR
System::getProperty
"abc"::length
String::length
super::toString
ArrayList::new
int[]::new
14 Sigma Ukraine
15. ПРИМЕР
Collection<String> c = Arrays.asList("A","B","CD");
System.out.println(sum(c,String::length));
15 Sigma Ukraine
16. ПРИМЕР
interface Code<T,R>{
R exec(T input);
}
public static <T,R extends Number> long sum(Collection<T> c ,Code<T,R> cd){
long rz = 0;
for(T t : c){
R v = cd.exec(t);
if(v!=null) {
rz+=v.longValue();
}
}
return rz;
}
16 Sigma Ukraine
17. ПРИМЕР
import java.util.function.*;
public static <T,R extends Number> long sum(Collection<T> c ,
Function<T,R> cd){
long rz = 0;
for(T t : c){
R v = cd.apply(t);
if(v!=null) {
rz+=v.longValue();
}
}
return rz;
}
17 Sigma Ukraine
19. ТЕОРИЯ
Добавляется в рантайм
Множественное наследование поведения.
Похоже на “C# extension methods”
Наследование –
1. Суперкласс (“class wins”)
2. Более спецефичный интерфейс (“subtype wins”)
3. Делать вид что метод абстрактный
1. Реализующий класс должен сделать выбор сам.
A.super.m()
19 Sigma Ukraine