作者 | Android 大强哥
责编 | 郭芮
出品 | CSDN 博客
@FunctionalInterface
public interface Runnable {
public abstract void run();
}
new Thread(new Runnable() {
@Override
public void run()
{
System.out.println("Hello");
System.out.println("Jimmy");
}
}).start();
() -> {
执行语句
}
new Thread(() -> {
System.out.println("Hello");
System.out.println("Jimmy");
}).start();
() -> 表达式
new Thread(() -> System.out.println("Hello")).start();
public interface OnClickListener {
/**
* Called when a view has been clicked.
*
* @param v The view that was clicked.
*/
void onClick(View v);
}
view.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
v.setVisibility(View.GONE);
}
});
([类名 ]变量名) -> {
执行语句
}
view.setOnClickListener((View v) -> {
v.setVisibility(View.GONE);
});
view.setOnClickListener((v) -> {
v.setVisibility(View.GONE);
});
变量名 -> {
执行语句
}
view.setOnClickListener(v -> {
v.setVisibility(View.GONE);
});
([类名 ]变量名) -> 表达式
变量名 -> 表达式
view.setOnClickListener(v -> v.setVisibility(View.GONE));
@FunctionalInterface
public interface Comparator<T> {
int compare(T o1, T o2);
}
List<Integer> list = Arrays.asList(1, 2, 3);
Collections.sort(list, new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
return o1.compareTo(o2);
}
});
([类名1 ]变量名1, [类名2 ]变量名2[, ...]) -> {
执行语句
}
Collections.sort(list, (Integer o1, Integer o2) -> {
return o1.compareTo(o2);
});
Collections.sort(list, (o1, o2) -> {
return o1.compareTo(o2);
});
([类名1 ]变量名1, [类名2 ]变量名2[, ...]) -> 表达式
Collections.sort(list, (o1, o2) -> o1.compareTo(o2));
Collections.sort(list, Integer::compareTo);
引用静态方法;
引用对象的方法;
引用类的方法;
引用构造方法。
([变量1, 变量2, ...]) -> 类名.静态方法名([变量1, 变量2, ...])
类名::静态方法名
public class Utils {
public static int compare(Integer o1, Integer o2) {
return o1.compareTo(o2);
}
}
Collections.sort(list, (o1, o2) -> Utils.compare(o1, o2));
Collections.sort(list, Utils::compare);
([变量1, 变量2, ...]) -> 对象引用.方法名([变量1, 变量2, ...])
对象引用::方法名
public class MyClass {
public int compare(Integer o1, Integer o2) {
return o1.compareTo(o2);
}
}
MyClass myClass = new MyClass();
Collections.sort(list, (o1, o2) -> myClass.compare(o1, o2));
MyClass myClass = new MyClass();
Collections.sort(list, myClass::compare);
this::方法名
private int compare(Integer o1, Integer o2) {
return o1.compareTo(o2);
}
Collections.sort(list, (o1, o2) -> compare(o1, o2));
Collections.sort(list, this::compare);
(变量1[, 变量2, ...]) -> 变量1.实例方法([变量2, ...])
变量1对应的类名::实例方法名
Collections.sort(list, (o1, o2) -> o1.compareTo(o2));
Collections.sort(list, Integer::compareTo);
([变量1, 变量2, ...]) -> new 类名([变量1, 变量2, ...])
类名::new
@FunctionalInterface
public interface Function<T, R> {
/**
* Applies this function to the given argument.
*
* @param t the function argument
* @return the function result
*/
R apply(T t);
// 省略部分代码
}
Function<Integer, ArrayList> function = new Function<Integer, ArrayList>() {
@Override
public ArrayList apply(Integer n) {
return new ArrayList(n);
}
};
List list = function.apply(10);
Function<Integer, ArrayList> function = n -> new ArrayList(n);
Function<Integer, ArrayList> function = ArrayList::new;
自定义函数接口
@FunctionalInterface
public interface MyInterface<T> {
void function(T t);
}
public class LambdaTest {
public static void main(String[] args) {
new Thread(new Runnable() {
@Override
public void run()
{
System.out.println("Hello World");
}
}).start();
}
}
LambdaTest.class
LambdaTest$1.class
public static void main(java.lang.String[]);
Code:
0: new #2 // class java/lang/Thread
3: dup
4: new #3 // class com/example/myapplication/lambda/LambdaTest$1
7: dup
8: invokespecial #4 // Method com/example/myapplication/lambda/LambdaTest$1."<init>":()V
11: invokespecial #5 // Method java/lang/Thread."<init>":(Ljava/lang/Runnable;)V
14: invokevirtual #6 // Method java/lang/Thread.start:()V
17: return
public class LambdaTest {
public static void main(String[] args) {
new Thread(() -> System.out.println("Hello World")).start();
}
}
public static void main(java.lang.String[]);
Code:
0: new #2 // class java/lang/Thread
3: dup
4: invokedynamic #3, 0 // InvokeDynamic #0:run:()Ljava/lang/Runnable;
9: invokespecial #4 // Method java/lang/Thread."<init>":(Ljava/lang/Runnable;)V
12: invokevirtual #5 // Method java/lang/Thread.start:()V
15: return
可以减少代码的书写,减少匿名内部类的创建,节省内存占用。
使用时不用去记忆所使用的接口和抽象函数。
易读性较差,阅读代码的人需要熟悉 Lambda 表达式和抽象函数中参数的类型。
不方便进行调试。
热 文 推 荐
☞Python 之父退休,C 语言之父与世长辞,各大编程语言创始人现状大曝光!
☞一览群智胡健:在中国完全照搬Palantir模式,这不现实
点击阅读原文参与开发者大调查,好礼送不停!