1 函数式接口
1.1 定义
- 函数式接口是只包含一个抽象方法声明的接口,如 java.lang.Runnable
1.2 声明方式
- @FunctionalInterface
1.3 案例
@FunctionalInterface
public interface WorkerInterface {
public void dosomething();
}
public class WorkInterfaceTest {
public static void excute(WorkerInterface workerInterface) {
workerInterface.dosomething();
}
public static void main(String[] args) {
// 运用同名类实现
excute(new WorkerInterface() {
@Override
public void dosomething() {
System.out.println("hello world");
}
});
// 用lambda表达式实现
excute(() -> System.out.println("hello world"));
}
}
运行结果:
hello world
hello world
2 Lambda 表达式和函数式接口
2.1 定义
- 为匿名函数,是没有声明的方法,即无访问修饰符、返回值和名称
2.2 语法
- (arg1, arg2...) -> { body }
- (type1 arg1, type2 arg2...) -> { body }
2.3 结构
- 一个 Lambda 表达式可以有 0 个或多个参数;
- 参数类型可明确声明,或根据上下文推断。如(int a)与(a)效果相同;
- 所有参数需在()内,参数之间用逗号隔开。如(a,b)或(int a, int b);
- 空圆括号代表参数为空;当只有一个参数,且其类型可推导时,圆括号()可省略。例如:a -> return a*a;
- Lambda 表达式的主体可包含零条或多条语句
- 如果 Lambda 表达式的主体只有一条语句,花括号{}可省略。匿名函数的返回类型与该主体表达式一致
- 如果 Lambda 表达式的主体包含一条以上语句,则表达式必须包含在花括号{}中(形成代码块)。匿名函数的返回类型与代码块的返回类型一致,若没有返回则为空
2.4 案例
2.4.1 实现 Runnable 接口
public class RunnableLambda {
public static void main(String[] args) {
// 1.1使用匿名内部类
new Thread(new Runnable() {
@Override
public void run() {
System.out.println("hello world1");
}
}).start();
// 1.2使用匿名内部类
Runnable r1 = new Runnable() {
@Override
public void run() {
System.out.println("hello world2");
}
};
r1.run();
// 2.1 lambda表达式
new Thread(() -> System.out.println("hello world3")).start();;
// 2.2 lambda表达式
Runnable r2 = ()-> System.out.println("hello world4");
r2.run();
}
}
结果
hello world1
hello world2
hello world3
hello world4
2.4.2 排序数组
-
匿名内部类的排序
public class ArraySortLambda {
public static void main(String[] args) {
String[] players = { "Jack", "Tom", "John", "Andy", "Role"};// 1.1 使用匿名内部类根据 name 排序 players Arrays.sort(players, new Comparator() { @Override public int compare(String s1, String s2) { return (s1.compareTo(s2)); } }); // java8新特性 Arrays.asList(players).stream().forEach(System.out::println); }
}
结果
Andy
Jack
John
Role
Tom
-
lambda 表达式的排序
import java.util.Arrays;
import java.util.Comparator;public class ArraySortLambda {
public static void main(String[] args) {
String[] players = { "Jack", "Tom", "John", "Andy", "Role"};
// 排序 1
Comparator sortByName = (String s1, String s2) -> (s1.compareTo(s2));
Arrays.sort(players, sortByName);
// 或者排序二
Arrays.sort(players, (String s1, String s2) -> (s1.compareTo(s2)));Arrays.asList(players).stream().forEach(System.out::println); }
}
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于