面向对象编程是对数据进行抽象;函数式编程是对行为进行抽象。
核心思想:使用不可变值和函数,函数对一个值进行处理,映射成另一个值。
lambda 表达式仅能放入如下代码:
- 预定义使用了
@Functional
注解的函数式接口,自带一个抽象函数的方法
- Single Abstract Method,单个抽象方法类型
这些称为 lambda 表达式的目标类型,可以用作返回类型,或 lambda 目标代码的参数。
若一个方法接收 Runnable、Comparable 或者 Callable 接口,都有 单个抽象方法,可以传入lambda表达式。
类似的,如果 一个方法接受声明于 java.util.function 包内的接口,例如 Predicate、Function、Consumer 或 Supplier,那么可以向其传 lambda 表达式。
基本格式
案例1
1 2 3 4 5 6 7 8 9 10 11
| new Thread(new Runnable() { pubic void run() { } }).start();
new Thread( ()->{ } ).start();
|
案例2
1 2 3 4 5 6 7 8 9
| Runnable r = new Runnable() { public void run() { System.out.println("Hello"); } }
Runnale r = () -> System.out.println("Hello");
|
1 2 3 4 5 6 7 8 9 10 11
| TreeSet<String> ts = new TreeSet<>(new Comparator<String>() { public int compare(String o1, String o2) { return Integer.compare(o1.length(), o2.length()); } });
TreeSet<String> ts = new TreeSet<> ( (o1, o2) -> Integer.compare(o1.length(), o2.length()) );
|
案例3
现有方法定义如下,其中IntBinaryOperator
是一个接口, IntBinaryOperator
是一个函数式接口并且自带一个抽象方法,因此可以使用lambda表达式。
1 2 3 4 5
| public static int calculateNum(IntBinaryOperator operator) { int a = 1; int b = 2; return operator.applyAsInt(a, b); }
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| int var = calculateNum(new IntBinaryOperator() { public int applyAsInt(int left, int right) { return left + right; } });
int var = calculateNum((int left, int right)->{ return left + right; });
int var = calculateNum((left, right)->left + right);
|
案例4
现有方法定义如下,IntPredicate
是一个接口 , IntPredicate
是一个函数式接口并且自带一个抽象方法,因此可以使用lambda表达式。
1 2 3 4 5 6 7 8
| public static void printNum(IntPredicate predicate) { int[] arr = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; for (int i : arr) { if (predicate.test(i)) { System.out.println(i); } } }
|
1 2 3 4 5 6 7 8 9 10 11
| printNum(new IntPredicate() { public boolean test(int value) { return value % 2 == 0; } });
printNum((int value)->{ return value % 2 == 0; });
|
案例5
1 2 3 4 5
| public static <R> R typeConver(Function<String, R> function) { String str="12345"; R result = function.apply(str); return result; }
|
1 2 3 4 5 6 7 8 9 10 11
| Integer res = typeConver(new Function<String, Integer> { public Integer apply(String s) { return Integer.valueOf(s); } });
Integer res = typeConver((String s)->{ return Integer.valueOf(s); });
|
案例6
1 2 3 4 5 6
| public static void foreachArr(IntConsumer consumer) { int[] arr = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; for (int i : arr) { consumer.accept(i); } }
|
1 2 3 4 5 6 7 8 9 10 11
| foreachArr(new IntConsumer() { public void accept(int value) { System.out.println(value); } });
foreachArr((int value)->{ System.out.println(value); });
|
省略规则
- 参数类型可以省略
- 方法体只有一句代码时大括号return和唯一一句代码的分号可以省略
- 方法只有一个参数时小括号可以省略