際際滷

際際滷Share a Scribd company logo
礆弍亟
于 Java 8

丼舒仆亳从仂于 亳从仂仍舒亶
1
8 2
丼仂?
舒亠仄?
舒从?
仂亞亟舒?
亟亠?
3
丼仂?
Runnable r =
() -> System.out.println("Hello");
4
亠 仆从亳仂仆舒仍仆 亳仗仂于
package java.util.function;
public interface Function<T, R> {
R apply(T t);
}
5
弌仗亠亳舒仍亳亰舒亳亳 亟仍 仗亳仄亳亳于仂于
43 亳仆亠亠亶舒 于 java.util.function: *Supplier, *Consumer, *Predicate, *Operator,
*Function.
 于亠 于舒亳舒仆
(void|int|long|double|T) -> (void|boolean|int|long|double|T)
 亠 仆亠从仂仍从仂 亟仍 仆从亳亶  亟于仄 仗舒舒仄亠舒仄亳.
6
亳仂亟亳 于亠亰亟亠 从舒亰于舒 于舒亳舒仆仆仂
7
仂于舒亳舒仆仆舒 仗仂亰亳亳
void foo(Supplier<PsiElement> factory) {
PsiElement element = factory.get();
...
}
void bar() {
Supplier<PsiClass> classes = ...
foo(classes); // <- 仆亠 从仂仄仗亳仍亳亠
}
8
仂于舒亳舒仆仆舒 仗仂亰亳亳
void foo(Supplier<? extends PsiElement> factory) {
PsiElement element = factory.get();
...
}
void bar() {
Supplier<PsiClass> classes = ...
foo(classes); // <- 亠仗亠 舒弍仂舒亠
}
9
仂仆舒于舒亳舒仆仆舒 仗仂亰亳亳
void foo(Consumer<PsiClass> consumer) {
PsiClass e = ...;
consumer.accept(e);
}
void bar() {
Consumer<PsiElement> consumer = ...
foo(consumer); // <- 仆亠 从仂仄仗亳仍亳亠
}
10
仂仆舒于舒亳舒仆仆舒 仗仂亰亳亳
void foo(Consumer<? super PsiClass> consumer) {
PsiClass e = ...;
consumer.accept(e);
}
void bar() {
Consumer<PsiElement> consumer = ...
foo(consumer); // <- 亠仗亠 舒弍仂舒亠
}
11
于舒亠 舒亰 亳 仂, 亳 仂
default V computeIfAbsent(K key,
Function<? super K, ? extends V> mappingFunction){
}
12
舒于亳仍仂 PECS
Producer extends, consumer super.
13
弍仆仂 仍亠亞从仂 亳仗舒于亳
仂弍舒于仍亠仆亳亠 ? extends 亳 ? super 于 仗舒舒仄亠 于亰于舒亠仄 仄亠仂亟仂于 仆亠
仍仂仄舒亠 仆亳 binary-compatibility, 仆亳 source-compatibility. (仍亳  仆亳 仆亠
仆舒仍亠亟仆亳从仂于.)
14
舒亠仄
丼仂弍 仗亳舒 弍仂仍亠亠 仗仂仂亶 亟仍 仗仂仆亳仄舒仆亳 从仂亟, 从于舒 仆亳亰从仂仂于仆亠于亠
亟亠舒仍亳.
15
仂亞亟舒-仂 仄 仗亳舒仍亳 舒从
void print(List<String> strings) {
for (int i = 0; i < strings.size(); i++) {
String s = strings.get(i);
System.out.println(s);
}
}
16
丐亠仗亠 仗亳亠仄 舒从
void print(List<String> strings) {
for (String s : strings) {
System.out.println(s);
}
}
17
 亠仍亳 仂-仂 弍仂仍亠亠 仍仂亢仆仂亠?
void move(List<PsiClass> classes) {
boolean containsAnonymous = false;
for (PsiClass aClass : classes) {
if (aClass instanceof PsiAnonymousClass) {
containsAnonymous = true;
break;
}
}
...
}
18
丐亠仗亠 仄仂亢仆仂 仆舒仗亳舒 舒从
void move(List<PsiClass> classes) {
boolean containsAnonymous =
classes.stream().anyMatch(
c -> c instanceof PsiAnonymousClass
);
...
}
19
仂亟 仄仂亢亠 弍 亳 弍仂仍亠亠 仍仂亢仆仄
void move(List<PsiClass> classes) {
int numberOfAnonymouses = 0;
for (PsiClass aClass : classes) {
if (aClass instanceof PsiAnonymousClass) {
numberOfAnonymouses++;
if (numberOfAnonymouses >= 2) {
break;
}
}
}
...
}
20
 亠亞仂 于亠 舒于仆仂 仄仂亢仆仂 仗仂亳
void move(List<PsiClass> classes) {
long numberOfAnonymouses = classes.stream()
.filter(c -> c instanceof PsiAnonymousClass)
.limit(2)
.count();
...
}
21
亠亞亟舒 仍亳 Stream API 仗仂舒亠?
void foo(List<PsiMethod> methods) {
List<PsiMethod> constructors =
methods.stream().filter(PsiMethod::isConstructor)
.collect(Collectors.toList());
}
void foo(List<PsiMethod> methods) {
List<PsiMethod> constructors =
ContainerUtil.filter(methods, PsiMethod::isConstructor);
}
22
亠亞亟舒 仍亳 Stream API 仗仂舒亠?
void foo(List<PsiMethod> methods) {
List<PsiMethod> constructors =
methods.stream().filter(PsiMethod::isConstructor)
.collect(Collectors.toList());
}
void foo(List<PsiMethod> methods) {
List<PsiMethod> constructors =
ContainerUtil.filter(methods, PsiMethod::isConstructor);
}
23
丼仂 亟亠仍舒亠 仂 仄亠仂亟?
Object bar(PsiElement element) {
return
Optional.ofNullable(element.getContainingFile())
.map(PsiFile::getVirtualFile)
.map(f -> ModuleUtilCore.findModuleForFile(f,
element.getProject()))
.orElse(null);
}
24
亅仂 仄仂亢亠 弍 仆亠 舒亰 仂亠于亳亟仆仂
Module findModule(PsiElement element) {
return
Optional.ofNullable(element.getContainingFile())
.map(PsiFile::getVirtualFile)
.map(f -> ModuleUtilCore.findModuleForFile(f,
element.getProject()))
.orElse(null);
}
25
丐仂 亢亠 亠亰仍舒
Module findModule(PsiElement element) {
PsiFile file = element.getContainingFile();
if (file == null) return null;
VirtualFile virtualFile = file.getVirtualFile();
if (virtualFile == null) return null;
return ModuleUtilCore.findModuleForFile(virtualFile,
element.getProject());
}
26
亞仂亶 仗亳仄亠
return Optional
.ofNullable(PyUtil.as(element,
PySubscriptionExpression.class))
.map(PySubscriptionExpression::getOperand)
.map(PyExpression::getText)
.filter(text -> text.equals(keywordContainerName))
.isPresent();
27
弌仂从舒舒亠 亠 弍仂仍亠
return element instanceof PySubscriptionExpression
&& keywordContainerName.equals(
((PySubscriptionExpression)element).getOperand().getText());
28
舒仄亠仆 Optional
仄亠仂 Optional 仄仂亢仆仂 亳仗仂仍亰仂于舒 @Nullable 亳仗, 仂仂弍亠仆仆仂 于 亳亞仆舒舒
仄亠仂亟仂于.
29
丼舒仂 亠 仆亠从仂仍从仂 于舒亳舒仆仂于
void foo(List<VirtualFile> files) {
...
files.stream().map(VirtualFile::getFileType)
.anyMatch(StdFileTypes.XML::equals)
files.stream().map(VirtualFile::getFileType)
.anyMatch(Predicate.isEqual(StdFileTypes.XML));
files.stream().anyMatch(file ->
file.getFileType().equals(StdFileTypes.XML));
...
}
30
亠亞从仂 仗仂仍亳 亰舒仗舒仆仆亶 从仂亟
Arrays.stream(PhpLibraryRoot. EP_NAME.getExtensions()).
map(PhpLibraryRoot::getProvider).
filter(PhpLibraryRootProvider::isRuntime).
map(provider -> provider.getLibraryRoot(getProject())).
filter(Optional::isPresent).
map(Optional::get).
map(VirtualFile::getChildren).
map(Arrays:: asList).
flatMap(Collection::stream).
filter(VirtualFile::isDirectory).
filter(module -> ! ".idea".equals(module.getName())).
...
31
IDEA 2017.1 仗仂仄仂亢亠 亠亞仂 仗仂亳
32
 亠亰仍舒亠 仗仂仍亳仄
Arrays.stream(PhpLibraryRoot. EP_NAME.getExtensions())
.map(PhpLibraryRoot::getProvider)
.filter(PhpLibraryRootProvider::isRuntime)
.map(provider -> provider.getLibraryRoot(getProject()))
.filter(Objects:: nonNull)
.flatMap(root -> Arrays. stream(root.getChildren()))
.filter(file -> file.isDirectory() && ! ".idea".equals(file.getName()))
...
33
亟亠
亟亠 亠 仄仂亞 弍 仗仂仍亠亰仆 仍礆弍亟?
34
仂舒 仗舒舒仄亠亳亰舒亳 亰仆舒亠仆亳亠仄
TreeNode buildTree(PsiClass aClass) {
...
for (PsiMethod method : aClass.getMethods()) {
root.add(createMethodNode(method));
}
...
}
35
丕弍舒 舒亳亠从亳亠 仄亠仂亟
TreeNode buildTree(PsiClass aClass,
boolean withStatic) {
...
for (PsiMethod method : aClass.getMethods()) {
if (withStatic || !method.getModifierList()
.hasModifierProperty(PsiModifier.STATIC)) {
root.add(createMethodNode(method));
}
}
...
}
36
弌仍亠亟ム舒 仗亠仆 仂弍仂弍亠仆亳
abstract class TreeBuilder {
protected abstract boolean acceptMethod(PsiMethod method);
TreeNode buildTree(PsiClass aClass) {
...
for (PsiMethod method : aClass.getMethods()) {
if (acceptMethod(method)) {
root.add(createMethodNode(method));
}
}
...
}
}
37
亠亠仍仂亢仆亠仆仂 亳 于亞仍磲亳 亞仂仄仂亰亟从仂
new TreeBuilder() {
@Override
protected boolean acceptMethod(PsiMethod method) {
return !method.getModifierList()
.hasModifierProperty(PsiModifier.STATIC);
}
}.buildTree(aClass);
38
舒舒仄亠亳亰舒亳 仗仂于亠亟亠仆亳亠仄
39
舒舒仄亠亳亰舒亳 仗仂于亠亟亠仆亳亠仄
TreeNode buildTree(PsiClass aClass,
Predicate<PsiMethod> methodFilter) {
...
for (PsiMethod method : aClass.getMethods()) {
if (methodFilter.test(method)) {
root.add(createMethodNode(method));
}
}
...
}
40
仗仂仍亰仂于舒 仂亢亠 仍亠亞从仂
buildTree(aClass,
method -> !method.getModifierList()
.hasModifierProperty(PsiModifier.STATIC));
41
丐舒从亳 仍舒亠于 仄仆仂亞仂
public abstract class NotNullLazyValue<T> {
private T myValue;
@NotNull
protected abstract T compute();
...
}
42
丐亠仗亠 仄仂亢仆仂 仂亰亟舒 弍亠亰 仆舒仍亠亟仂于舒仆亳
public abstract class NotNullLazyValue<T> {
...
@NotNull
public static <T> NotNullLazyValue<T>
createValue(@NotNull NotNullFactory<T> value) {
...
};
}
43
 弍仂仍亠亠 仍仂亢仆亠 仍舒亳
仍舒 FileReferenceSet, 弍仂仍亠 100 仆舒仍亠亟仆亳从仂于, 仗仂仍仂于亳仆舒 亳亰 仆亳 
舒仆仂仆亳仄仆亠 从仍舒, 23 仄亠仂亟舒, 从仂仂亠 仗亠亠仂仗亠亟亠仍ム 于 仆舒仍亠亟仆亳从舒.
44
亞仍磲 于仂 舒从
return new FileReferenceSet(...) {
protected boolean isSoft() { return soft; }
public boolean isAbsolutePathreference() { return true; }
public boolean couldBeConvertedTo(boolean relative) {...}
public boolean absoluteUrlNeedsStartSlash() {
String s = getPathString();
return s != null && !s.isEmpty() && s.charAt(0) == '/';
}
public Collection<PsiFileSystemItem>
computeDefaultContexts() {...}
}.getAllReferences();
45
舒从
舒从 仍礆弍亟 仂亠仆 于仆亳?
46
 仍亳 亰亟亠 亠从舒 仗舒仄亳?
public class Foo {
void foo() {
Runnable r = new Runnable() {
public void run() {
System.out.println("Bye!");
}
};
Runtime.getRuntime()
.addShutdownHook(new Thread(r));
}
...
}
47
舒, 亠 仍从舒 仆舒 于仆亠仆亳亶 仂弍亠从
class Foo$1 implements Runnable {
final Foo this$0;
public Foo$1(Foo foo) {
this$0 = foo;
}
...
}
48
亅从亰亠仄仗仍 仂亰亟舒 从舒亢亟亶 舒亰
ContainerUtil.filter(methods,
new Condition<PsiMethod>() {
public boolean value(PsiMethod psiMethod) {
return psiMethod.isConstructor();
}
}
);
49
仂 仂 从仂仄仗亳仍亳仂于舒 仍磡仄亟?
public class Simple {
public static void main(String[] args) {
Runnable r =
() -> System.out.println("Hello");
new Thread(r).start();
}
}
50
弌舒仄舒 仗仂舒 亠舒仍亳亰舒亳  舒仆仂仆亳仄
public class Simple {
public static void main(String[] args) {
Runnable r = new Runnable() {
public void run() {
System.out.println("Hello");
}
}
new Thread(r).start();
}
}
51
丕 舒从仂亶 亠舒仍亳亰舒亳亳 亠 仆亠亟仂舒从亳
 仍亳仆亳亶 class-舒亶仍 仆舒 亟亳从亠
 从舒亢亟亶 舒亰 仂亰亟舒 仆仂于亶 从亰亠仄仗仍
 Class 仆亠 弍亟亠 仂弍舒仆 于 仄仂, 仗仂从舒 亟仂亳亢亳仄 亠亞仂 ClassLoader
52
仆仂仆亳仄仆 仍亳 舒仆仂仆亳仄?
Class.forName("Simple$1",
true, Simple.class.getClassLoader())
53
亢亠仆 仍亳 于仂仂弍亠 从仍舒 亟仍 仍礆弍亟?
舒, 于亠亟 仄仂亢仆仂 于亰于舒 r.getClass().
r.getClass().getName()于亠仆 仂-仂 于仂亟亠
"Simple$$Lambda$1/1149319664"
Unsafe.getUnsafe().defineAnonymousClass(...)
54
仍舒 仍礆弍亟  亟亠亶于亳亠仍仆仂 舒仆仂仆亳仄仆
boolean isLambda(Runnable r) {
try {
Class.forName(r.getClass().getName(), false,
r.getClass().getClassLoader());
return false;
}
catch (ClassNotFoundException e) {
return true;
}
}
55
仂 弍亟亠 亞亠仆亠亳仂于舒 从仂亟, 仂亰亟舒ム亳亶 仍礆弍亟?
舒仗亳于舒 仂 从仂亟 于 从舒亢亟亶 从仍舒 仆亠亠从亳于仆仂. 丐亠弍亠 仂弍亳亶 仄亠仂亟
于 舒仆亟舒仆仂亶 弍亳弍仍亳仂亠从亠, 从仂仂亶 弍亟亠 仂亰亟舒于舒 于亠 从仍舒 仍礆弍亟.
舒亰仂于仄 亠亞仂 LambdaMetafactory.metafactory.
仂 于 仆亠亞仂 仆舒亟仂 从舒从-仂 仗亠亠亟舒于舒 亳仆仂仄舒亳 仗仂 仂, 从舒从仂亶 仄亠仂亟 从舒从仂亞仂
亳仆亠亠亶舒 亟仂仍亢仆舒 亠舒仍亳亰仂于于舒 仍礆弍亟舒, 亳 从仂亟 亠 亠仍舒.
56
仍 仆舒舒仍舒 亟亠仍舒亠仄 desugaring
public class Simple {
public static void main(String[] args) {
Runnable r = Simple::lambda$main$0;
new Thread(r).start();
}
private static void lambda$main$0() {
System.out.println("Hello");
}
}
57
MethodHandle
public abstract class MethodHandle {
@PolymorphicSignature
public final native Object invoke(Object... args)
throws Throwable;
public MethodType type() { ... }
...
}
public class MethodType {
public static MethodType methodType(Class<?> rtype) {...}
public static MethodType methodType(Class<?> rtype,
Class<?> ptype0) {...}
...
}
58
仍亳亳 仂 java.lang.reflect.Method
 仗仂于亠从舒 亟仂仗舒 于 仄仂仄亠仆 仂亰亟舒仆亳, 舒 仆亠 于亰仂于舒
 舒弍仂舒ム 仆亠 仂仍从仂  仄亠仂亟舒仄亳, 仆仂 亳  仗仂仍礆亳, 从仂仆从仂舒仄亳, 
 仄仂亞 亟亠仍舒 仗亠仂弍舒亰仂于舒仆亳 仗舒舒仄亠仂于 亳 于仂亰于舒舒亠仄仂亞仂 亰仆舒亠仆亳
 舒弍仂舒ム  仗亳仄亳亳于仆仄亳 亳仗舒仄亳 仆舒仗礆, 弍亠亰 亰舒于仂舒亳于舒仆亳 于
仂弍亠从
 仆亠 仂亰亟舒 仄舒亳于 亟仍 仗亠亠亟舒亳 舒亞仄亠仆仂于
59
亠舒仍亳亰舒亳 仍礆弍亟, 仗仂仗从舒 1
public class LambdaMetafactory {
public static Object metafactory0(
String samMethodName,
Class<?> samType,
MethodType samMethodType,
MethodHandle implMethod) {
...
Class cls = Unsafe.getUnsafe()
.defineAnonymousClass(...);
return cls.newInstance();
}
} 60
亠舒仍亳亰舒亳 仍礆弍亟, 仗仂仗从舒 1
public class Simple {
public static void main(String[] args) throws Throwable {
MethodHandle implMethod =
MethodHandles.lookup().findStatic(Simple.class,
"lambda$main$0", MethodType.methodType(void.class));
MethodType samMethodType = MethodType.methodType(void.class);
Runnable r = (Runnable) LambdaMetafactory.metafactory0(
"run", Runnable.class, samMethodType, implMethod);
new Thread(r).start();
}
private static void lambda$main$0() {
System.out.println("Hello");
}
}
61
仂仗从舒 2: 从亳亠仄 仍礆弍亟
public class Simple {
private static Object[] lambdas = new Object[1];
public static void main(String[] args) throws Throwable {
if (lambdas[0] == null) {
...
lambdas[0] = LambdaMetafactory.metafactory0(
"run", Runnable.class, samMethodType, implMethod);
}
Runnable r = (Runnable) lambdas[0];
new Thread(r).start();
}
...
}
62
CallSite
public abstract class CallSite {
public abstract MethodHandle getTarget();
...
}
public class ConstantCallSite extends CallSite {
public ConstantCallSite(MethodHandle target) {...}
}
63
仂仗从舒 3: invokeDynamic
public class Simple {
private static CallSite[] callSites = new CallSite[1];
public static void main(String[] args) throws Throwable {
if (callSites[0] == null) {
MethodHandle implMethod = MethodHandles. lookup().findStatic(
Simple. class, "lambda$main$0", MethodType.methodType(void.class));
MethodType samMethodType = MethodType. methodType(void.class);
callSites[0] = LambdaMetafactory. metafactory(
MethodHandles. lookup(),
"run", MethodType.methodType(Runnable.class),
samMethodType, implMethod, samMethodType);
}
Runnable r = (Runnable) callSites[0].getTarget().invoke();
...
}
...
64
仂仗从舒 3: invokeDynamic
public class Simple {
private static CallSite[] callSites = new CallSite[1];
public static void main(String[] args) throws Throwable {
if (callSites[0] == null) {
MethodHandle implMethod = MethodHandles. lookup().findStatic(
Simple.class, "lambda$main$0", MethodType.methodType(void.class));
MethodType samMethodType = MethodType.methodType(void.class);
callSites[0] = LambdaMetafactory. metafactory(
MethodHandles. lookup(),
"run", MethodType.methodType(Runnable.class),
samMethodType, implMethod, samMethodType);
}
Runnable r = (Runnable) callSites[0].getTarget().invoke() ;
...
}
...
65
仂仗从舒 3: 亠舒仍仆舒 metafactory
static CallSite metafactory(MethodHandles.Lookup caller,
String invokedName, MethodType invokedType,
MethodType samMethodType, MethodHandle implMethod,
MethodType instantiatedMethodType) {
Class cls = Unsafe.getUnsafe()
.defineAnonymousClass(...);
if (invokedType.parameterCount() == 0) {
Object instance = cls.newInstance();
return new ConstantCallSite(
MethodHandles.constant(samType, instance));
}
...
}
66
舒仄从舒仆亳 (capturing lambdas)
public class CapturingLambda {
public void foo(String name) {
Runnable r = () ->
System.out.println("Hello, " + name);
new Thread(r).start();
}
}
67
舒仄从舒仆亳: desugaring
public class CapturingLambda {
public void foo(String name) {
Runnable r = () -> lambda$foo$0(name);
new Thread(r).start();
}
private static void lambda$foo$0(String name) {
System.out.println("Hello, " + name);
}
}
68
舒仄从舒仆亳: 从仍舒 仍礆弍亟
final class CapturingLambda$$Lambda$1 implements Runnable {
private final String arg$1;
private CapturingLambda$$Lambda$1(String s) {
arg$1 = s;
}
private static Runnable get$Lambda(String s) {
return new CapturingLambda$$Lambda$1(s);
}
public void run() {
System.out.println("Hello, " + arg$1);
}
}
69
舒仄从舒仆亳: 从亳仂于舒仆亳亠 于 metafactory
static CallSite metafactory(MethodHandles.Lookup caller,
String invokedName, MethodType invokedType,
MethodType samMethodType, MethodHandle implMethod,
MethodType instantiatedMethodType) {
Class cls = Unsafe.getUnsafe()
.defineAnonymousClass(...);
if (invokedType.parameterCount() == 0) {...}
else {
return new ConstantCallSite(
MethodHandles.Lookup.IMPL_LOOKUP.findStatic(cls,"get$Lambda",
invokedType));
}
}
70
舒仄从舒仆亳: invokeDynamic
public class CapturingLambda {
private static CallSite[] callSites = new CallSite[1];
public void foo(String name) throws Throwable {
if (callSites[0] == null) {
MethodHandle implMethod =
MethodHandles. lookup().findStatic(CapturingLambda. class,
"lambda$foo$0", MethodType.methodType(void.class, String.class));
MethodType samMethodType = MethodType. methodType(void.class);
callSites[0] = LambdaMetafactory. metafactory(MethodHandles. lookup(),
"run", MethodType.methodType(Runnable.class, String.class),
samMethodType, implMethod, samMethodType);
}
Runnable r = (Runnable) callSites[0].getTarget().invoke(name);
...
71
于亠
72
丕亠从亳 仗舒仄亳 仆亠
public class Foo {
void foo() {
Runnable r =() -> System.out.println("Bye!");
Runtime.getRuntime()
.addShutdownHook(new Thread(r));
}
...
}
73
亅从亰亠仄仗仍 亟仍 non-capturing 仗亠亠亳仗仂仍亰亠
ContainerUtil.filter(methods,
method -> method.isConstructor();
);
ContainerUtil.filter(methods,PsiMethod::isConstructor)
74
亅仂 仄仂亢亠 仗亳于仂亟亳 从 仗仂弍仍亠仄舒仄
public interface Disposable {
void dispose();
}
public class Disposer {
public static void register(Disposable parent,
Disposable child) {
...
map.put(parent, child);
}
}
75
仍亳 仍礆弍亟 舒于仆亳于舒ム 从舒从 仂弍亠从
private final Disposable parent = new Disposable() {
public void dispose() { }
};
void foo() {
Disposer.register(parent, ...);
}
private final Disposable parent = () -> { };
void foo() {
Disposer.register(parent, ...);
}
76
礆弍亟 舒弍仂舒ム 亟仂舒仂仆仂 亠从亳于仆仂
 仂亰亟舒仆亳亠, 亳 于亰仂于 仂仂仂 亳仆仍舒亶仆.
77
弌仍从亳
Refactoring to Functional Style with Java 8 by Venkat Subramaniam
Stream API, 舒 1, 弌亠亞亠亶 从亠仆从仂
Stream API: Tagir Valeev
Translation of Lambda Expressions by Brian Goetz
仍弍仂从仂亠 仗仂亞亢亠仆亳亠 于 invokedynamic, 仍舒亟亳仄亳 于舒仆仂于
78
仂亞亳
 亳仗仂仍亰亶亠 仍礆弍亟 亳 亳仄, 仂弍 仗亳舒 弍仂仍亠亠 于仂从仂仂于仆亠于亶 亳
仗仂仆仆亶 从仂亟
 仆仂 仆亠 于仍亠从舒亶亠, 仆从亳仂仆舒仍仆亶 亳仍  仆亠 舒仄仂亠仍, 舒 仍亳
亠亟于仂
 亳亰舒亶亠, 从舒从 仂 仂亠仆仂; 仂仂弍亠仆仆仂 亠仍亳 仆舒从舒亠亠 仆舒 仆亠仗仂仆仆仂亠
仗仂于亠亟亠仆亳亠
79
 于仂仗仂?
80

More Related Content

What's hot (9)

丱舒舒从亠仆亠 亠 仆从亳仂仆舒仍仆 磶从仂于 仗仂亞舒仄仄亳仂于舒仆亳
丱舒舒从亠仆亠 亠 仆从亳仂仆舒仍仆 磶从仂于 仗仂亞舒仄仄亳仂于舒仆亳丱舒舒从亠仆亠 亠 仆从亳仂仆舒仍仆 磶从仂于 仗仂亞舒仄仄亳仂于舒仆亳
丱舒舒从亠仆亠 亠 仆从亳仂仆舒仍仆 磶从仂于 仗仂亞舒仄仄亳仂于舒仆亳
Alex.Kolonitsky
Java 仂亠仆 2014 亰舒仆亳亠 3
Java 仂亠仆 2014 亰舒仆亳亠 3Java 仂亠仆 2014 亰舒仆亳亠 3
Java 仂亠仆 2014 亰舒仆亳亠 3
Technopark
亠从亳 12. 亠亠, Python, 亠 弍亠亠.
亠从亳 12. 亠亠, Python, 亠 弍亠亠.亠从亳 12. 亠亠, Python, 亠 弍亠亠.
亠从亳 12. 亠亠, Python, 亠 弍亠亠.
Roman Brovko
亠从亳 9. 仂亟仍亳, 仗舒从亠 亳 亳亠仄舒 亳仄仗仂舒.
亠从亳 9. 仂亟仍亳, 仗舒从亠 亳 亳亠仄舒 亳仄仗仂舒.亠从亳 9. 仂亟仍亳, 仗舒从亠 亳 亳亠仄舒 亳仄仗仂舒.
亠从亳 9. 仂亟仍亳, 仗舒从亠 亳 亳亠仄舒 亳仄仗仂舒.
Roman Brovko
弍亠从仆仂-仂亳亠仆亳仂于舒仆仆仂亠 仗仂亞舒仄仄亳仂于舒仆亳亠. 亠从亳 5 亳 6
弍亠从仆仂-仂亳亠仆亳仂于舒仆仆仂亠 仗仂亞舒仄仄亳仂于舒仆亳亠. 亠从亳 5 亳 6弍亠从仆仂-仂亳亠仆亳仂于舒仆仆仂亠 仗仂亞舒仄仄亳仂于舒仆亳亠. 亠从亳 5 亳 6
弍亠从仆仂-仂亳亠仆亳仂于舒仆仆仂亠 仗仂亞舒仄仄亳仂于舒仆亳亠. 亠从亳 5 亳 6
Dima Dzuba
Discovering Lambdas in Java 8
Discovering Lambdas in Java 8Discovering Lambdas in Java 8
Discovering Lambdas in Java 8
Stfalcon Meetups
07 - Java. 亅仍亠仄亠仆 仆从亳仂仆舒仍仆仂亞仂 仗仂亞舒仄仄亳仂于舒仆亳 于 Java
07 - Java. 亅仍亠仄亠仆 仆从亳仂仆舒仍仆仂亞仂 仗仂亞舒仄仄亳仂于舒仆亳 于 Java07 - Java. 亅仍亠仄亠仆 仆从亳仂仆舒仍仆仂亞仂 仗仂亞舒仄仄亳仂于舒仆亳 于 Java
07 - Java. 亅仍亠仄亠仆 仆从亳仂仆舒仍仆仂亞仂 仗仂亞舒仄仄亳仂于舒仆亳 于 Java
Roman Brovko
仂仆仂于 Java 仗亠亠仄亠仆仆亠, 亳从仍
仂仆仂于 Java   仗亠亠仄亠仆仆亠, 亳从仍仂仆仂于 Java   仗亠亠仄亠仆仆亠, 亳从仍
仂仆仂于 Java 仗亠亠仄亠仆仆亠, 亳从仍
Sergey Nemchinsky
丱舒舒从亠仆亠 亠 仆从亳仂仆舒仍仆 磶从仂于 仗仂亞舒仄仄亳仂于舒仆亳
丱舒舒从亠仆亠 亠 仆从亳仂仆舒仍仆 磶从仂于 仗仂亞舒仄仄亳仂于舒仆亳丱舒舒从亠仆亠 亠 仆从亳仂仆舒仍仆 磶从仂于 仗仂亞舒仄仄亳仂于舒仆亳
丱舒舒从亠仆亠 亠 仆从亳仂仆舒仍仆 磶从仂于 仗仂亞舒仄仄亳仂于舒仆亳
Alex.Kolonitsky
Java 仂亠仆 2014 亰舒仆亳亠 3
Java 仂亠仆 2014 亰舒仆亳亠 3Java 仂亠仆 2014 亰舒仆亳亠 3
Java 仂亠仆 2014 亰舒仆亳亠 3
Technopark
亠从亳 12. 亠亠, Python, 亠 弍亠亠.
亠从亳 12. 亠亠, Python, 亠 弍亠亠.亠从亳 12. 亠亠, Python, 亠 弍亠亠.
亠从亳 12. 亠亠, Python, 亠 弍亠亠.
Roman Brovko
亠从亳 9. 仂亟仍亳, 仗舒从亠 亳 亳亠仄舒 亳仄仗仂舒.
亠从亳 9. 仂亟仍亳, 仗舒从亠 亳 亳亠仄舒 亳仄仗仂舒.亠从亳 9. 仂亟仍亳, 仗舒从亠 亳 亳亠仄舒 亳仄仗仂舒.
亠从亳 9. 仂亟仍亳, 仗舒从亠 亳 亳亠仄舒 亳仄仗仂舒.
Roman Brovko
弍亠从仆仂-仂亳亠仆亳仂于舒仆仆仂亠 仗仂亞舒仄仄亳仂于舒仆亳亠. 亠从亳 5 亳 6
弍亠从仆仂-仂亳亠仆亳仂于舒仆仆仂亠 仗仂亞舒仄仄亳仂于舒仆亳亠. 亠从亳 5 亳 6弍亠从仆仂-仂亳亠仆亳仂于舒仆仆仂亠 仗仂亞舒仄仄亳仂于舒仆亳亠. 亠从亳 5 亳 6
弍亠从仆仂-仂亳亠仆亳仂于舒仆仆仂亠 仗仂亞舒仄仄亳仂于舒仆亳亠. 亠从亳 5 亳 6
Dima Dzuba
Discovering Lambdas in Java 8
Discovering Lambdas in Java 8Discovering Lambdas in Java 8
Discovering Lambdas in Java 8
Stfalcon Meetups
07 - Java. 亅仍亠仄亠仆 仆从亳仂仆舒仍仆仂亞仂 仗仂亞舒仄仄亳仂于舒仆亳 于 Java
07 - Java. 亅仍亠仄亠仆 仆从亳仂仆舒仍仆仂亞仂 仗仂亞舒仄仄亳仂于舒仆亳 于 Java07 - Java. 亅仍亠仄亠仆 仆从亳仂仆舒仍仆仂亞仂 仗仂亞舒仄仄亳仂于舒仆亳 于 Java
07 - Java. 亅仍亠仄亠仆 仆从亳仂仆舒仍仆仂亞仂 仗仂亞舒仄仄亳仂于舒仆亳 于 Java
Roman Brovko
仂仆仂于 Java 仗亠亠仄亠仆仆亠, 亳从仍
仂仆仂于 Java   仗亠亠仄亠仆仆亠, 亳从仍仂仆仂于 Java   仗亠亠仄亠仆仆亠, 亳从仍
仂仆仂于 Java 仗亠亠仄亠仆仆亠, 亳从仍
Sergey Nemchinsky

Viewers also liked (9)

Plugin development for intelli j platform
Plugin development for intelli j platformPlugin development for intelli j platform
Plugin development for intelli j platform
chashnikov
API design in java project
API design in java projectAPI design in java project
API design in java project
chashnikov
Effective coding in IntelliJ IDEA
Effective coding in IntelliJ IDEAEffective coding in IntelliJ IDEA
Effective coding in IntelliJ IDEA
chashnikov
Java compilers and IDEs
Java compilers and IDEsJava compilers and IDEs
Java compilers and IDEs
chashnikov
Statis code analysis
Statis code analysisStatis code analysis
Statis code analysis
chashnikov
2015 Upload Campaigns Calendar - 際際滷Share
2015 Upload Campaigns Calendar - 際際滷Share2015 Upload Campaigns Calendar - 際際滷Share
2015 Upload Campaigns Calendar - 際際滷Share
際際滷Share
What to Upload to 際際滷Share
What to Upload to 際際滷ShareWhat to Upload to 際際滷Share
What to Upload to 際際滷Share
際際滷Share
How to Make Awesome 際際滷Shares: Tips & Tricks
How to Make Awesome 際際滷Shares: Tips & TricksHow to Make Awesome 際際滷Shares: Tips & Tricks
How to Make Awesome 際際滷Shares: Tips & Tricks
際際滷Share
Getting Started With 際際滷Share
Getting Started With 際際滷ShareGetting Started With 際際滷Share
Getting Started With 際際滷Share
際際滷Share
Plugin development for intelli j platform
Plugin development for intelli j platformPlugin development for intelli j platform
Plugin development for intelli j platform
chashnikov
API design in java project
API design in java projectAPI design in java project
API design in java project
chashnikov
Effective coding in IntelliJ IDEA
Effective coding in IntelliJ IDEAEffective coding in IntelliJ IDEA
Effective coding in IntelliJ IDEA
chashnikov
Java compilers and IDEs
Java compilers and IDEsJava compilers and IDEs
Java compilers and IDEs
chashnikov
Statis code analysis
Statis code analysisStatis code analysis
Statis code analysis
chashnikov
2015 Upload Campaigns Calendar - 際際滷Share
2015 Upload Campaigns Calendar - 際際滷Share2015 Upload Campaigns Calendar - 際際滷Share
2015 Upload Campaigns Calendar - 際際滷Share
際際滷Share
What to Upload to 際際滷Share
What to Upload to 際際滷ShareWhat to Upload to 際際滷Share
What to Upload to 際際滷Share
際際滷Share
How to Make Awesome 際際滷Shares: Tips & Tricks
How to Make Awesome 際際滷Shares: Tips & TricksHow to Make Awesome 際際滷Shares: Tips & Tricks
How to Make Awesome 際際滷Shares: Tips & Tricks
際際滷Share
Getting Started With 際際滷Share
Getting Started With 際際滷ShareGetting Started With 際際滷Share
Getting Started With 際際滷Share
際際滷Share

Similar to Lambdas in java 8 (20)

弌舒亳亠从亳亶 亳 亟亳仆舒仄亳亠从亳亶 仗仂仍亳仄仂亳亰仄 于 C++, 仄亳亳亶 亠于舒仆仂于
弌舒亳亠从亳亶 亳 亟亳仆舒仄亳亠从亳亶 仗仂仍亳仄仂亳亰仄 于 C++, 仄亳亳亶 亠于舒仆仂于弌舒亳亠从亳亶 亳 亟亳仆舒仄亳亠从亳亶 仗仂仍亳仄仂亳亰仄 于 C++, 仄亳亳亶 亠于舒仆仂于
弌舒亳亠从亳亶 亳 亟亳仆舒仄亳亠从亳亶 仗仂仍亳仄仂亳亰仄 于 C++, 仄亳亳亶 亠于舒仆仂于
Yandex
仗舒亠仆 仗仂亞舒仄仄亳仂于舒仆亳
仗舒亠仆 仗仂亞舒仄仄亳仂于舒仆亳仗舒亠仆 仗仂亞舒仄仄亳仂于舒仆亳
仗舒亠仆 仗仂亞舒仄仄亳仂于舒仆亳
guestfc8ae0
C++ STL & Qt. 舒仆亳亠 02.
C++ STL & Qt. 舒仆亳亠 02.C++ STL & Qt. 舒仆亳亠 02.
C++ STL & Qt. 舒仆亳亠 02.
Igor Shkulipa
Scala on android
Scala on androidScala on android
Scala on android
Valeriya Atamanova
C++ STL & Qt. 舒仆亳亠 01.
C++ STL & Qt. 舒仆亳亠 01.C++ STL & Qt. 舒仆亳亠 01.
C++ STL & Qt. 舒仆亳亠 01.
Igor Shkulipa
亠 从仂仆从亳亳 于 Python - 仍亠亞 丿亳亟仍仂于从亳亶, Python Meetup 26.09.2014
亠 从仂仆从亳亳 于 Python - 仍亠亞 丿亳亟仍仂于从亳亶, Python Meetup 26.09.2014亠 从仂仆从亳亳 于 Python - 仍亠亞 丿亳亟仍仂于从亳亶, Python Meetup 26.09.2014
亠 从仂仆从亳亳 于 Python - 仍亠亞 丿亳亟仍仂于从亳亶, Python Meetup 26.09.2014
Python Meetup
丼仂 仆舒仄 仂亳 DAL 仗仂仂亳? 从仍磻仂于 仄 D2D Just.NET
丼仂 仆舒仄 仂亳 DAL 仗仂仂亳? 从仍磻仂于 仄 D2D Just.NET丼仂 仆舒仄 仂亳 DAL 仗仂仂亳? 从仍磻仂于 仄 D2D Just.NET
丼仂 仆舒仄 仂亳 DAL 仗仂仂亳? 从仍磻仂于 仄 D2D Just.NET
Dev2Dev
亠从亳 8. 亠舒仂, 亞亠仆亠舒仂 亳 仄仂亟仍 itertools.
 亠从亳 8. 亠舒仂, 亞亠仆亠舒仂 亳 仄仂亟仍 itertools. 亠从亳 8. 亠舒仂, 亞亠仆亠舒仂 亳 仄仂亟仍 itertools.
亠从亳 8. 亠舒仂, 亞亠仆亠舒仂 亳 仄仂亟仍 itertools.
Roman Brovko
舒亰舒弍仂从舒 亠于亠仂于 亳 亠于亠仆 仗亳仍仂亢亠仆亳亶 仍亠从亳 3
舒亰舒弍仂从舒 亠于亠仂于 亳 亠于亠仆 仗亳仍仂亢亠仆亳亶 仍亠从亳 3舒亰舒弍仂从舒 亠于亠仂于 亳 亠于亠仆 仗亳仍仂亢亠仆亳亶 仍亠从亳 3
舒亰舒弍仂从舒 亠于亠仂于 亳 亠于亠仆 仗亳仍仂亢亠仆亳亶 仍亠从亳 3
etyumentcev
舒亰舒弍仂从舒 亠于亠仂于 亳 亠于亠仆 仗亳仍仂亢亠仆亳亶 仍亠从亳 3
舒亰舒弍仂从舒 亠于亠仂于 亳 亠于亠仆 仗亳仍仂亢亠仆亳亶 仍亠从亳 3舒亰舒弍仂从舒 亠于亠仂于 亳 亠于亠仆 仗亳仍仂亢亠仆亳亶 仍亠从亳 3
舒亰舒弍仂从舒 亠于亠仂于 亳 亠于亠仆 仗亳仍仂亢亠仆亳亶 仍亠从亳 3
Eugeniy Tyumentcev
JPoint 2016 - Etudes of DIY Java profiler
JPoint 2016 - Etudes of DIY Java profilerJPoint 2016 - Etudes of DIY Java profiler
JPoint 2016 - Etudes of DIY Java profiler
Anton Arhipov
Rust: 舒弍舒从亳亳 亳 弍亠亰仂仗舒仆仂, 仂于亠亠仆仆仂 弍亠仗仍舒仆仂
Rust: 舒弍舒从亳亳 亳 弍亠亰仂仗舒仆仂, 仂于亠亠仆仆仂 弍亠仗仍舒仆仂Rust: 舒弍舒从亳亳 亳 弍亠亰仂仗舒仆仂, 仂于亠亠仆仆仂 弍亠仗仍舒仆仂
Rust: 舒弍舒从亳亳 亳 弍亠亰仂仗舒仆仂, 仂于亠亠仆仆仂 弍亠仗仍舒仆仂
Open-IT
弌舒亳亠从亳亶 亳 亟亳仆舒仄亳亠从亳亶 仗仂仍亳仄仂亳亰仄 于 C++, 仄亳亳亶 亠于舒仆仂于
弌舒亳亠从亳亶 亳 亟亳仆舒仄亳亠从亳亶 仗仂仍亳仄仂亳亰仄 于 C++, 仄亳亳亶 亠于舒仆仂于弌舒亳亠从亳亶 亳 亟亳仆舒仄亳亠从亳亶 仗仂仍亳仄仂亳亰仄 于 C++, 仄亳亳亶 亠于舒仆仂于
弌舒亳亠从亳亶 亳 亟亳仆舒仄亳亠从亳亶 仗仂仍亳仄仂亳亰仄 于 C++, 仄亳亳亶 亠于舒仆仂于
Yandex
Java 仂亠仆 2014 亰舒仆亳亠 5
Java 仂亠仆 2014 亰舒仆亳亠 5Java 仂亠仆 2014 亰舒仆亳亠 5
Java 仂亠仆 2014 亰舒仆亳亠 5
Technopark
C# Desktop. 舒仆亳亠 06.
C# Desktop. 舒仆亳亠 06.C# Desktop. 舒仆亳亠 06.
C# Desktop. 舒仆亳亠 06.
Igor Shkulipa
Java 仂亠仆 2013 仍亠从亳 2
Java 仂亠仆 2013 仍亠从亳 2Java 仂亠仆 2013 仍亠从亳 2
Java 仂亠仆 2013 仍亠从亳 2
Technopark
亠仆 于从仆亶 从 Guava
亠仆 于从仆亶 从 Guava亠仆 于从仆亶 从 Guava
亠仆 于从仆亶 从 Guava
Egor Chernyshev
[JAM 1.1] Clean Code (Paul Malikov)
[JAM 1.1] Clean Code (Paul Malikov)[JAM 1.1] Clean Code (Paul Malikov)
[JAM 1.1] Clean Code (Paul Malikov)
Evgeny Kaziak
CPU Performance in Java.
CPU Performance in Java.CPU Performance in Java.
CPU Performance in Java.
Dzmitry Hil
弌舒亳亠从亳亶 亳 亟亳仆舒仄亳亠从亳亶 仗仂仍亳仄仂亳亰仄 于 C++, 仄亳亳亶 亠于舒仆仂于
弌舒亳亠从亳亶 亳 亟亳仆舒仄亳亠从亳亶 仗仂仍亳仄仂亳亰仄 于 C++, 仄亳亳亶 亠于舒仆仂于弌舒亳亠从亳亶 亳 亟亳仆舒仄亳亠从亳亶 仗仂仍亳仄仂亳亰仄 于 C++, 仄亳亳亶 亠于舒仆仂于
弌舒亳亠从亳亶 亳 亟亳仆舒仄亳亠从亳亶 仗仂仍亳仄仂亳亰仄 于 C++, 仄亳亳亶 亠于舒仆仂于
Yandex
仗舒亠仆 仗仂亞舒仄仄亳仂于舒仆亳
仗舒亠仆 仗仂亞舒仄仄亳仂于舒仆亳仗舒亠仆 仗仂亞舒仄仄亳仂于舒仆亳
仗舒亠仆 仗仂亞舒仄仄亳仂于舒仆亳
guestfc8ae0
C++ STL & Qt. 舒仆亳亠 02.
C++ STL & Qt. 舒仆亳亠 02.C++ STL & Qt. 舒仆亳亠 02.
C++ STL & Qt. 舒仆亳亠 02.
Igor Shkulipa
C++ STL & Qt. 舒仆亳亠 01.
C++ STL & Qt. 舒仆亳亠 01.C++ STL & Qt. 舒仆亳亠 01.
C++ STL & Qt. 舒仆亳亠 01.
Igor Shkulipa
亠 从仂仆从亳亳 于 Python - 仍亠亞 丿亳亟仍仂于从亳亶, Python Meetup 26.09.2014
亠 从仂仆从亳亳 于 Python - 仍亠亞 丿亳亟仍仂于从亳亶, Python Meetup 26.09.2014亠 从仂仆从亳亳 于 Python - 仍亠亞 丿亳亟仍仂于从亳亶, Python Meetup 26.09.2014
亠 从仂仆从亳亳 于 Python - 仍亠亞 丿亳亟仍仂于从亳亶, Python Meetup 26.09.2014
Python Meetup
丼仂 仆舒仄 仂亳 DAL 仗仂仂亳? 从仍磻仂于 仄 D2D Just.NET
丼仂 仆舒仄 仂亳 DAL 仗仂仂亳? 从仍磻仂于 仄 D2D Just.NET丼仂 仆舒仄 仂亳 DAL 仗仂仂亳? 从仍磻仂于 仄 D2D Just.NET
丼仂 仆舒仄 仂亳 DAL 仗仂仂亳? 从仍磻仂于 仄 D2D Just.NET
Dev2Dev
亠从亳 8. 亠舒仂, 亞亠仆亠舒仂 亳 仄仂亟仍 itertools.
 亠从亳 8. 亠舒仂, 亞亠仆亠舒仂 亳 仄仂亟仍 itertools. 亠从亳 8. 亠舒仂, 亞亠仆亠舒仂 亳 仄仂亟仍 itertools.
亠从亳 8. 亠舒仂, 亞亠仆亠舒仂 亳 仄仂亟仍 itertools.
Roman Brovko
舒亰舒弍仂从舒 亠于亠仂于 亳 亠于亠仆 仗亳仍仂亢亠仆亳亶 仍亠从亳 3
舒亰舒弍仂从舒 亠于亠仂于 亳 亠于亠仆 仗亳仍仂亢亠仆亳亶 仍亠从亳 3舒亰舒弍仂从舒 亠于亠仂于 亳 亠于亠仆 仗亳仍仂亢亠仆亳亶 仍亠从亳 3
舒亰舒弍仂从舒 亠于亠仂于 亳 亠于亠仆 仗亳仍仂亢亠仆亳亶 仍亠从亳 3
etyumentcev
舒亰舒弍仂从舒 亠于亠仂于 亳 亠于亠仆 仗亳仍仂亢亠仆亳亶 仍亠从亳 3
舒亰舒弍仂从舒 亠于亠仂于 亳 亠于亠仆 仗亳仍仂亢亠仆亳亶 仍亠从亳 3舒亰舒弍仂从舒 亠于亠仂于 亳 亠于亠仆 仗亳仍仂亢亠仆亳亶 仍亠从亳 3
舒亰舒弍仂从舒 亠于亠仂于 亳 亠于亠仆 仗亳仍仂亢亠仆亳亶 仍亠从亳 3
Eugeniy Tyumentcev
JPoint 2016 - Etudes of DIY Java profiler
JPoint 2016 - Etudes of DIY Java profilerJPoint 2016 - Etudes of DIY Java profiler
JPoint 2016 - Etudes of DIY Java profiler
Anton Arhipov
Rust: 舒弍舒从亳亳 亳 弍亠亰仂仗舒仆仂, 仂于亠亠仆仆仂 弍亠仗仍舒仆仂
Rust: 舒弍舒从亳亳 亳 弍亠亰仂仗舒仆仂, 仂于亠亠仆仆仂 弍亠仗仍舒仆仂Rust: 舒弍舒从亳亳 亳 弍亠亰仂仗舒仆仂, 仂于亠亠仆仆仂 弍亠仗仍舒仆仂
Rust: 舒弍舒从亳亳 亳 弍亠亰仂仗舒仆仂, 仂于亠亠仆仆仂 弍亠仗仍舒仆仂
Open-IT
弌舒亳亠从亳亶 亳 亟亳仆舒仄亳亠从亳亶 仗仂仍亳仄仂亳亰仄 于 C++, 仄亳亳亶 亠于舒仆仂于
弌舒亳亠从亳亶 亳 亟亳仆舒仄亳亠从亳亶 仗仂仍亳仄仂亳亰仄 于 C++, 仄亳亳亶 亠于舒仆仂于弌舒亳亠从亳亶 亳 亟亳仆舒仄亳亠从亳亶 仗仂仍亳仄仂亳亰仄 于 C++, 仄亳亳亶 亠于舒仆仂于
弌舒亳亠从亳亶 亳 亟亳仆舒仄亳亠从亳亶 仗仂仍亳仄仂亳亰仄 于 C++, 仄亳亳亶 亠于舒仆仂于
Yandex
Java 仂亠仆 2014 亰舒仆亳亠 5
Java 仂亠仆 2014 亰舒仆亳亠 5Java 仂亠仆 2014 亰舒仆亳亠 5
Java 仂亠仆 2014 亰舒仆亳亠 5
Technopark
C# Desktop. 舒仆亳亠 06.
C# Desktop. 舒仆亳亠 06.C# Desktop. 舒仆亳亠 06.
C# Desktop. 舒仆亳亠 06.
Igor Shkulipa
Java 仂亠仆 2013 仍亠从亳 2
Java 仂亠仆 2013 仍亠从亳 2Java 仂亠仆 2013 仍亠从亳 2
Java 仂亠仆 2013 仍亠从亳 2
Technopark
亠仆 于从仆亶 从 Guava
亠仆 于从仆亶 从 Guava亠仆 于从仆亶 从 Guava
亠仆 于从仆亶 从 Guava
Egor Chernyshev
[JAM 1.1] Clean Code (Paul Malikov)
[JAM 1.1] Clean Code (Paul Malikov)[JAM 1.1] Clean Code (Paul Malikov)
[JAM 1.1] Clean Code (Paul Malikov)
Evgeny Kaziak
CPU Performance in Java.
CPU Performance in Java.CPU Performance in Java.
CPU Performance in Java.
Dzmitry Hil

Lambdas in java 8

  • 2. 8 2
  • 4. 丼仂? Runnable r = () -> System.out.println("Hello"); 4
  • 5. 亠 仆从亳仂仆舒仍仆 亳仗仂于 package java.util.function; public interface Function<T, R> { R apply(T t); } 5
  • 6. 弌仗亠亳舒仍亳亰舒亳亳 亟仍 仗亳仄亳亳于仂于 43 亳仆亠亠亶舒 于 java.util.function: *Supplier, *Consumer, *Predicate, *Operator, *Function. 于亠 于舒亳舒仆 (void|int|long|double|T) -> (void|boolean|int|long|double|T) 亠 仆亠从仂仍从仂 亟仍 仆从亳亶 亟于仄 仗舒舒仄亠舒仄亳. 6
  • 8. 仂于舒亳舒仆仆舒 仗仂亰亳亳 void foo(Supplier<PsiElement> factory) { PsiElement element = factory.get(); ... } void bar() { Supplier<PsiClass> classes = ... foo(classes); // <- 仆亠 从仂仄仗亳仍亳亠 } 8
  • 9. 仂于舒亳舒仆仆舒 仗仂亰亳亳 void foo(Supplier<? extends PsiElement> factory) { PsiElement element = factory.get(); ... } void bar() { Supplier<PsiClass> classes = ... foo(classes); // <- 亠仗亠 舒弍仂舒亠 } 9
  • 10. 仂仆舒于舒亳舒仆仆舒 仗仂亰亳亳 void foo(Consumer<PsiClass> consumer) { PsiClass e = ...; consumer.accept(e); } void bar() { Consumer<PsiElement> consumer = ... foo(consumer); // <- 仆亠 从仂仄仗亳仍亳亠 } 10
  • 11. 仂仆舒于舒亳舒仆仆舒 仗仂亰亳亳 void foo(Consumer<? super PsiClass> consumer) { PsiClass e = ...; consumer.accept(e); } void bar() { Consumer<PsiElement> consumer = ... foo(consumer); // <- 亠仗亠 舒弍仂舒亠 } 11
  • 12. 于舒亠 舒亰 亳 仂, 亳 仂 default V computeIfAbsent(K key, Function<? super K, ? extends V> mappingFunction){ } 12
  • 14. 弍仆仂 仍亠亞从仂 亳仗舒于亳 仂弍舒于仍亠仆亳亠 ? extends 亳 ? super 于 仗舒舒仄亠 于亰于舒亠仄 仄亠仂亟仂于 仆亠 仍仂仄舒亠 仆亳 binary-compatibility, 仆亳 source-compatibility. (仍亳 仆亳 仆亠 仆舒仍亠亟仆亳从仂于.) 14
  • 15. 舒亠仄 丼仂弍 仗亳舒 弍仂仍亠亠 仗仂仂亶 亟仍 仗仂仆亳仄舒仆亳 从仂亟, 从于舒 仆亳亰从仂仂于仆亠于亠 亟亠舒仍亳. 15
  • 16. 仂亞亟舒-仂 仄 仗亳舒仍亳 舒从 void print(List<String> strings) { for (int i = 0; i < strings.size(); i++) { String s = strings.get(i); System.out.println(s); } } 16
  • 17. 丐亠仗亠 仗亳亠仄 舒从 void print(List<String> strings) { for (String s : strings) { System.out.println(s); } } 17
  • 18. 亠仍亳 仂-仂 弍仂仍亠亠 仍仂亢仆仂亠? void move(List<PsiClass> classes) { boolean containsAnonymous = false; for (PsiClass aClass : classes) { if (aClass instanceof PsiAnonymousClass) { containsAnonymous = true; break; } } ... } 18
  • 19. 丐亠仗亠 仄仂亢仆仂 仆舒仗亳舒 舒从 void move(List<PsiClass> classes) { boolean containsAnonymous = classes.stream().anyMatch( c -> c instanceof PsiAnonymousClass ); ... } 19
  • 20. 仂亟 仄仂亢亠 弍 亳 弍仂仍亠亠 仍仂亢仆仄 void move(List<PsiClass> classes) { int numberOfAnonymouses = 0; for (PsiClass aClass : classes) { if (aClass instanceof PsiAnonymousClass) { numberOfAnonymouses++; if (numberOfAnonymouses >= 2) { break; } } } ... } 20
  • 21. 亠亞仂 于亠 舒于仆仂 仄仂亢仆仂 仗仂亳 void move(List<PsiClass> classes) { long numberOfAnonymouses = classes.stream() .filter(c -> c instanceof PsiAnonymousClass) .limit(2) .count(); ... } 21
  • 22. 亠亞亟舒 仍亳 Stream API 仗仂舒亠? void foo(List<PsiMethod> methods) { List<PsiMethod> constructors = methods.stream().filter(PsiMethod::isConstructor) .collect(Collectors.toList()); } void foo(List<PsiMethod> methods) { List<PsiMethod> constructors = ContainerUtil.filter(methods, PsiMethod::isConstructor); } 22
  • 23. 亠亞亟舒 仍亳 Stream API 仗仂舒亠? void foo(List<PsiMethod> methods) { List<PsiMethod> constructors = methods.stream().filter(PsiMethod::isConstructor) .collect(Collectors.toList()); } void foo(List<PsiMethod> methods) { List<PsiMethod> constructors = ContainerUtil.filter(methods, PsiMethod::isConstructor); } 23
  • 24. 丼仂 亟亠仍舒亠 仂 仄亠仂亟? Object bar(PsiElement element) { return Optional.ofNullable(element.getContainingFile()) .map(PsiFile::getVirtualFile) .map(f -> ModuleUtilCore.findModuleForFile(f, element.getProject())) .orElse(null); } 24
  • 25. 亅仂 仄仂亢亠 弍 仆亠 舒亰 仂亠于亳亟仆仂 Module findModule(PsiElement element) { return Optional.ofNullable(element.getContainingFile()) .map(PsiFile::getVirtualFile) .map(f -> ModuleUtilCore.findModuleForFile(f, element.getProject())) .orElse(null); } 25
  • 26. 丐仂 亢亠 亠亰仍舒 Module findModule(PsiElement element) { PsiFile file = element.getContainingFile(); if (file == null) return null; VirtualFile virtualFile = file.getVirtualFile(); if (virtualFile == null) return null; return ModuleUtilCore.findModuleForFile(virtualFile, element.getProject()); } 26
  • 28. 弌仂从舒舒亠 亠 弍仂仍亠 return element instanceof PySubscriptionExpression && keywordContainerName.equals( ((PySubscriptionExpression)element).getOperand().getText()); 28
  • 29. 舒仄亠仆 Optional 仄亠仂 Optional 仄仂亢仆仂 亳仗仂仍亰仂于舒 @Nullable 亳仗, 仂仂弍亠仆仆仂 于 亳亞仆舒舒 仄亠仂亟仂于. 29
  • 30. 丼舒仂 亠 仆亠从仂仍从仂 于舒亳舒仆仂于 void foo(List<VirtualFile> files) { ... files.stream().map(VirtualFile::getFileType) .anyMatch(StdFileTypes.XML::equals) files.stream().map(VirtualFile::getFileType) .anyMatch(Predicate.isEqual(StdFileTypes.XML)); files.stream().anyMatch(file -> file.getFileType().equals(StdFileTypes.XML)); ... } 30
  • 31. 亠亞从仂 仗仂仍亳 亰舒仗舒仆仆亶 从仂亟 Arrays.stream(PhpLibraryRoot. EP_NAME.getExtensions()). map(PhpLibraryRoot::getProvider). filter(PhpLibraryRootProvider::isRuntime). map(provider -> provider.getLibraryRoot(getProject())). filter(Optional::isPresent). map(Optional::get). map(VirtualFile::getChildren). map(Arrays:: asList). flatMap(Collection::stream). filter(VirtualFile::isDirectory). filter(module -> ! ".idea".equals(module.getName())). ... 31
  • 32. IDEA 2017.1 仗仂仄仂亢亠 亠亞仂 仗仂亳 32
  • 33. 亠亰仍舒亠 仗仂仍亳仄 Arrays.stream(PhpLibraryRoot. EP_NAME.getExtensions()) .map(PhpLibraryRoot::getProvider) .filter(PhpLibraryRootProvider::isRuntime) .map(provider -> provider.getLibraryRoot(getProject())) .filter(Objects:: nonNull) .flatMap(root -> Arrays. stream(root.getChildren())) .filter(file -> file.isDirectory() && ! ".idea".equals(file.getName())) ... 33
  • 34. 亟亠 亟亠 亠 仄仂亞 弍 仗仂仍亠亰仆 仍礆弍亟? 34
  • 35. 仂舒 仗舒舒仄亠亳亰舒亳 亰仆舒亠仆亳亠仄 TreeNode buildTree(PsiClass aClass) { ... for (PsiMethod method : aClass.getMethods()) { root.add(createMethodNode(method)); } ... } 35
  • 36. 丕弍舒 舒亳亠从亳亠 仄亠仂亟 TreeNode buildTree(PsiClass aClass, boolean withStatic) { ... for (PsiMethod method : aClass.getMethods()) { if (withStatic || !method.getModifierList() .hasModifierProperty(PsiModifier.STATIC)) { root.add(createMethodNode(method)); } } ... } 36
  • 37. 弌仍亠亟ム舒 仗亠仆 仂弍仂弍亠仆亳 abstract class TreeBuilder { protected abstract boolean acceptMethod(PsiMethod method); TreeNode buildTree(PsiClass aClass) { ... for (PsiMethod method : aClass.getMethods()) { if (acceptMethod(method)) { root.add(createMethodNode(method)); } } ... } } 37
  • 38. 亠亠仍仂亢仆亠仆仂 亳 于亞仍磲亳 亞仂仄仂亰亟从仂 new TreeBuilder() { @Override protected boolean acceptMethod(PsiMethod method) { return !method.getModifierList() .hasModifierProperty(PsiModifier.STATIC); } }.buildTree(aClass); 38
  • 40. 舒舒仄亠亳亰舒亳 仗仂于亠亟亠仆亳亠仄 TreeNode buildTree(PsiClass aClass, Predicate<PsiMethod> methodFilter) { ... for (PsiMethod method : aClass.getMethods()) { if (methodFilter.test(method)) { root.add(createMethodNode(method)); } } ... } 40
  • 41. 仗仂仍亰仂于舒 仂亢亠 仍亠亞从仂 buildTree(aClass, method -> !method.getModifierList() .hasModifierProperty(PsiModifier.STATIC)); 41
  • 42. 丐舒从亳 仍舒亠于 仄仆仂亞仂 public abstract class NotNullLazyValue<T> { private T myValue; @NotNull protected abstract T compute(); ... } 42
  • 43. 丐亠仗亠 仄仂亢仆仂 仂亰亟舒 弍亠亰 仆舒仍亠亟仂于舒仆亳 public abstract class NotNullLazyValue<T> { ... @NotNull public static <T> NotNullLazyValue<T> createValue(@NotNull NotNullFactory<T> value) { ... }; } 43
  • 44. 弍仂仍亠亠 仍仂亢仆亠 仍舒亳 仍舒 FileReferenceSet, 弍仂仍亠 100 仆舒仍亠亟仆亳从仂于, 仗仂仍仂于亳仆舒 亳亰 仆亳 舒仆仂仆亳仄仆亠 从仍舒, 23 仄亠仂亟舒, 从仂仂亠 仗亠亠仂仗亠亟亠仍ム 于 仆舒仍亠亟仆亳从舒. 44
  • 45. 亞仍磲 于仂 舒从 return new FileReferenceSet(...) { protected boolean isSoft() { return soft; } public boolean isAbsolutePathreference() { return true; } public boolean couldBeConvertedTo(boolean relative) {...} public boolean absoluteUrlNeedsStartSlash() { String s = getPathString(); return s != null && !s.isEmpty() && s.charAt(0) == '/'; } public Collection<PsiFileSystemItem> computeDefaultContexts() {...} }.getAllReferences(); 45
  • 47. 仍亳 亰亟亠 亠从舒 仗舒仄亳? public class Foo { void foo() { Runnable r = new Runnable() { public void run() { System.out.println("Bye!"); } }; Runtime.getRuntime() .addShutdownHook(new Thread(r)); } ... } 47
  • 48. 舒, 亠 仍从舒 仆舒 于仆亠仆亳亶 仂弍亠从 class Foo$1 implements Runnable { final Foo this$0; public Foo$1(Foo foo) { this$0 = foo; } ... } 48
  • 49. 亅从亰亠仄仗仍 仂亰亟舒 从舒亢亟亶 舒亰 ContainerUtil.filter(methods, new Condition<PsiMethod>() { public boolean value(PsiMethod psiMethod) { return psiMethod.isConstructor(); } } ); 49
  • 50. 仂 仂 从仂仄仗亳仍亳仂于舒 仍磡仄亟? public class Simple { public static void main(String[] args) { Runnable r = () -> System.out.println("Hello"); new Thread(r).start(); } } 50
  • 51. 弌舒仄舒 仗仂舒 亠舒仍亳亰舒亳 舒仆仂仆亳仄 public class Simple { public static void main(String[] args) { Runnable r = new Runnable() { public void run() { System.out.println("Hello"); } } new Thread(r).start(); } } 51
  • 52. 丕 舒从仂亶 亠舒仍亳亰舒亳亳 亠 仆亠亟仂舒从亳 仍亳仆亳亶 class-舒亶仍 仆舒 亟亳从亠 从舒亢亟亶 舒亰 仂亰亟舒 仆仂于亶 从亰亠仄仗仍 Class 仆亠 弍亟亠 仂弍舒仆 于 仄仂, 仗仂从舒 亟仂亳亢亳仄 亠亞仂 ClassLoader 52
  • 54. 亢亠仆 仍亳 于仂仂弍亠 从仍舒 亟仍 仍礆弍亟? 舒, 于亠亟 仄仂亢仆仂 于亰于舒 r.getClass(). r.getClass().getName()于亠仆 仂-仂 于仂亟亠 "Simple$$Lambda$1/1149319664" Unsafe.getUnsafe().defineAnonymousClass(...) 54
  • 55. 仍舒 仍礆弍亟 亟亠亶于亳亠仍仆仂 舒仆仂仆亳仄仆 boolean isLambda(Runnable r) { try { Class.forName(r.getClass().getName(), false, r.getClass().getClassLoader()); return false; } catch (ClassNotFoundException e) { return true; } } 55
  • 56. 仂 弍亟亠 亞亠仆亠亳仂于舒 从仂亟, 仂亰亟舒ム亳亶 仍礆弍亟? 舒仗亳于舒 仂 从仂亟 于 从舒亢亟亶 从仍舒 仆亠亠从亳于仆仂. 丐亠弍亠 仂弍亳亶 仄亠仂亟 于 舒仆亟舒仆仂亶 弍亳弍仍亳仂亠从亠, 从仂仂亶 弍亟亠 仂亰亟舒于舒 于亠 从仍舒 仍礆弍亟. 舒亰仂于仄 亠亞仂 LambdaMetafactory.metafactory. 仂 于 仆亠亞仂 仆舒亟仂 从舒从-仂 仗亠亠亟舒于舒 亳仆仂仄舒亳 仗仂 仂, 从舒从仂亶 仄亠仂亟 从舒从仂亞仂 亳仆亠亠亶舒 亟仂仍亢仆舒 亠舒仍亳亰仂于于舒 仍礆弍亟舒, 亳 从仂亟 亠 亠仍舒. 56
  • 57. 仍 仆舒舒仍舒 亟亠仍舒亠仄 desugaring public class Simple { public static void main(String[] args) { Runnable r = Simple::lambda$main$0; new Thread(r).start(); } private static void lambda$main$0() { System.out.println("Hello"); } } 57
  • 58. MethodHandle public abstract class MethodHandle { @PolymorphicSignature public final native Object invoke(Object... args) throws Throwable; public MethodType type() { ... } ... } public class MethodType { public static MethodType methodType(Class<?> rtype) {...} public static MethodType methodType(Class<?> rtype, Class<?> ptype0) {...} ... } 58
  • 59. 仍亳亳 仂 java.lang.reflect.Method 仗仂于亠从舒 亟仂仗舒 于 仄仂仄亠仆 仂亰亟舒仆亳, 舒 仆亠 于亰仂于舒 舒弍仂舒ム 仆亠 仂仍从仂 仄亠仂亟舒仄亳, 仆仂 亳 仗仂仍礆亳, 从仂仆从仂舒仄亳, 仄仂亞 亟亠仍舒 仗亠仂弍舒亰仂于舒仆亳 仗舒舒仄亠仂于 亳 于仂亰于舒舒亠仄仂亞仂 亰仆舒亠仆亳 舒弍仂舒ム 仗亳仄亳亳于仆仄亳 亳仗舒仄亳 仆舒仗礆, 弍亠亰 亰舒于仂舒亳于舒仆亳 于 仂弍亠从 仆亠 仂亰亟舒 仄舒亳于 亟仍 仗亠亠亟舒亳 舒亞仄亠仆仂于 59
  • 60. 亠舒仍亳亰舒亳 仍礆弍亟, 仗仂仗从舒 1 public class LambdaMetafactory { public static Object metafactory0( String samMethodName, Class<?> samType, MethodType samMethodType, MethodHandle implMethod) { ... Class cls = Unsafe.getUnsafe() .defineAnonymousClass(...); return cls.newInstance(); } } 60
  • 61. 亠舒仍亳亰舒亳 仍礆弍亟, 仗仂仗从舒 1 public class Simple { public static void main(String[] args) throws Throwable { MethodHandle implMethod = MethodHandles.lookup().findStatic(Simple.class, "lambda$main$0", MethodType.methodType(void.class)); MethodType samMethodType = MethodType.methodType(void.class); Runnable r = (Runnable) LambdaMetafactory.metafactory0( "run", Runnable.class, samMethodType, implMethod); new Thread(r).start(); } private static void lambda$main$0() { System.out.println("Hello"); } } 61
  • 62. 仂仗从舒 2: 从亳亠仄 仍礆弍亟 public class Simple { private static Object[] lambdas = new Object[1]; public static void main(String[] args) throws Throwable { if (lambdas[0] == null) { ... lambdas[0] = LambdaMetafactory.metafactory0( "run", Runnable.class, samMethodType, implMethod); } Runnable r = (Runnable) lambdas[0]; new Thread(r).start(); } ... } 62
  • 63. CallSite public abstract class CallSite { public abstract MethodHandle getTarget(); ... } public class ConstantCallSite extends CallSite { public ConstantCallSite(MethodHandle target) {...} } 63
  • 64. 仂仗从舒 3: invokeDynamic public class Simple { private static CallSite[] callSites = new CallSite[1]; public static void main(String[] args) throws Throwable { if (callSites[0] == null) { MethodHandle implMethod = MethodHandles. lookup().findStatic( Simple. class, "lambda$main$0", MethodType.methodType(void.class)); MethodType samMethodType = MethodType. methodType(void.class); callSites[0] = LambdaMetafactory. metafactory( MethodHandles. lookup(), "run", MethodType.methodType(Runnable.class), samMethodType, implMethod, samMethodType); } Runnable r = (Runnable) callSites[0].getTarget().invoke(); ... } ... 64
  • 65. 仂仗从舒 3: invokeDynamic public class Simple { private static CallSite[] callSites = new CallSite[1]; public static void main(String[] args) throws Throwable { if (callSites[0] == null) { MethodHandle implMethod = MethodHandles. lookup().findStatic( Simple.class, "lambda$main$0", MethodType.methodType(void.class)); MethodType samMethodType = MethodType.methodType(void.class); callSites[0] = LambdaMetafactory. metafactory( MethodHandles. lookup(), "run", MethodType.methodType(Runnable.class), samMethodType, implMethod, samMethodType); } Runnable r = (Runnable) callSites[0].getTarget().invoke() ; ... } ... 65
  • 66. 仂仗从舒 3: 亠舒仍仆舒 metafactory static CallSite metafactory(MethodHandles.Lookup caller, String invokedName, MethodType invokedType, MethodType samMethodType, MethodHandle implMethod, MethodType instantiatedMethodType) { Class cls = Unsafe.getUnsafe() .defineAnonymousClass(...); if (invokedType.parameterCount() == 0) { Object instance = cls.newInstance(); return new ConstantCallSite( MethodHandles.constant(samType, instance)); } ... } 66
  • 67. 舒仄从舒仆亳 (capturing lambdas) public class CapturingLambda { public void foo(String name) { Runnable r = () -> System.out.println("Hello, " + name); new Thread(r).start(); } } 67
  • 68. 舒仄从舒仆亳: desugaring public class CapturingLambda { public void foo(String name) { Runnable r = () -> lambda$foo$0(name); new Thread(r).start(); } private static void lambda$foo$0(String name) { System.out.println("Hello, " + name); } } 68
  • 69. 舒仄从舒仆亳: 从仍舒 仍礆弍亟 final class CapturingLambda$$Lambda$1 implements Runnable { private final String arg$1; private CapturingLambda$$Lambda$1(String s) { arg$1 = s; } private static Runnable get$Lambda(String s) { return new CapturingLambda$$Lambda$1(s); } public void run() { System.out.println("Hello, " + arg$1); } } 69
  • 70. 舒仄从舒仆亳: 从亳仂于舒仆亳亠 于 metafactory static CallSite metafactory(MethodHandles.Lookup caller, String invokedName, MethodType invokedType, MethodType samMethodType, MethodHandle implMethod, MethodType instantiatedMethodType) { Class cls = Unsafe.getUnsafe() .defineAnonymousClass(...); if (invokedType.parameterCount() == 0) {...} else { return new ConstantCallSite( MethodHandles.Lookup.IMPL_LOOKUP.findStatic(cls,"get$Lambda", invokedType)); } } 70
  • 71. 舒仄从舒仆亳: invokeDynamic public class CapturingLambda { private static CallSite[] callSites = new CallSite[1]; public void foo(String name) throws Throwable { if (callSites[0] == null) { MethodHandle implMethod = MethodHandles. lookup().findStatic(CapturingLambda. class, "lambda$foo$0", MethodType.methodType(void.class, String.class)); MethodType samMethodType = MethodType. methodType(void.class); callSites[0] = LambdaMetafactory. metafactory(MethodHandles. lookup(), "run", MethodType.methodType(Runnable.class, String.class), samMethodType, implMethod, samMethodType); } Runnable r = (Runnable) callSites[0].getTarget().invoke(name); ... 71
  • 73. 丕亠从亳 仗舒仄亳 仆亠 public class Foo { void foo() { Runnable r =() -> System.out.println("Bye!"); Runtime.getRuntime() .addShutdownHook(new Thread(r)); } ... } 73
  • 74. 亅从亰亠仄仗仍 亟仍 non-capturing 仗亠亠亳仗仂仍亰亠 ContainerUtil.filter(methods, method -> method.isConstructor(); ); ContainerUtil.filter(methods,PsiMethod::isConstructor) 74
  • 75. 亅仂 仄仂亢亠 仗亳于仂亟亳 从 仗仂弍仍亠仄舒仄 public interface Disposable { void dispose(); } public class Disposer { public static void register(Disposable parent, Disposable child) { ... map.put(parent, child); } } 75
  • 76. 仍亳 仍礆弍亟 舒于仆亳于舒ム 从舒从 仂弍亠从 private final Disposable parent = new Disposable() { public void dispose() { } }; void foo() { Disposer.register(parent, ...); } private final Disposable parent = () -> { }; void foo() { Disposer.register(parent, ...); } 76
  • 77. 礆弍亟 舒弍仂舒ム 亟仂舒仂仆仂 亠从亳于仆仂 仂亰亟舒仆亳亠, 亳 于亰仂于 仂仂仂 亳仆仍舒亶仆. 77
  • 78. 弌仍从亳 Refactoring to Functional Style with Java 8 by Venkat Subramaniam Stream API, 舒 1, 弌亠亞亠亶 从亠仆从仂 Stream API: Tagir Valeev Translation of Lambda Expressions by Brian Goetz 仍弍仂从仂亠 仗仂亞亢亠仆亳亠 于 invokedynamic, 仍舒亟亳仄亳 于舒仆仂于 78
  • 79. 仂亞亳 亳仗仂仍亰亶亠 仍礆弍亟 亳 亳仄, 仂弍 仗亳舒 弍仂仍亠亠 于仂从仂仂于仆亠于亶 亳 仗仂仆仆亶 从仂亟 仆仂 仆亠 于仍亠从舒亶亠, 仆从亳仂仆舒仍仆亶 亳仍 仆亠 舒仄仂亠仍, 舒 仍亳 亠亟于仂 亳亰舒亶亠, 从舒从 仂 仂亠仆仂; 仂仂弍亠仆仆仂 亠仍亳 仆舒从舒亠亠 仆舒 仆亠仗仂仆仆仂亠 仗仂于亠亟亠仆亳亠 79