Lambda 表达式
public void expr1() {
/*
* 在最简单的形式中,一个lambda可以由用逗号分隔的参数列表、–>符号与函数体三部分表示
*/
Arrays.asList("a", "b", "c").forEach(e -> System.out.println(e));
Arrays.asList(1, 2, 3).forEach((Integer e) -> {
e *= 2;
System.out.println(e);
});
}
Java标准库中的java.lang.Runnable和java.util.Comparator都是典型的函数式接口
Comparator 接口 - 函数式排序
public void expr2() {
/*
* 1. Lambda可能会返回一个值
* 2. 返回值的类型也是由编译器推测出来的
* 3. 如果lambda的函数体只有一行的话,那么没有必要显式使用return语句
*/
List<Integer> list = Arrays.asList(5, 7, 2, 3);
//Lambda表达式“(x, y) -> y - x”实现了java.util.Comparator接口
// list.sort((e1, e2) -> e1.compareTo(e2)); // 升序
list.sort((e1, e2) -> e2.compareTo(e1)); // 降序
System.out.println(list);
}
Runnable 接口
import org.junit.Test;
public class ThreadUseLambda {
/*
* 对于函数式接口:
* 除了可以使用Java中标准的方法来创建实现对象之外,还可以使用lambda表达式来创建实现对象
* 比如:
* Java标准库中的java.lang.Runnable和java.util.Comparator都是典型的函数式接口
*/
public void sum(int a, int b) {
System.out.println(a+b);
}
@Test
public void runThreadUseLambda() {
// 线程1
new Thread(() -> {
sum(1, 3);
}).start();
// 线程2
new Thread(() -> {
sum(2, 4);
}).start();
}
}
函数式接口Function
Java SE 8增加了 java.util.function 包,里面都是可以在开发中使用的函数式接口。开发人员也可以创建新的函数式接口。
package redis.practice;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.function.Function;
public class CollectionUtils {
/*
* map 函数:
* 参数: input; processor -> Function -> T, 参数; R, 返回值
*/
public static List<String> map(List<String> input, Function<String, String> processor) {
ArrayList<String> result = new ArrayList<String>();
for (String obj : input) {
// Function apply -> 执行函数业务逻辑
result.add(processor.apply(obj));
}
return result;
}
public static void main(String[] args) {
List<String> input = Arrays.asList(new String[] {"apple", "orange", "pear"});
List<String> lengths = CollectionUtils.map(input, (String v) -> String.valueOf(v.length()));
List<String> uppercases = CollectionUtils.map(input, (String v) -> v.toUpperCase());
System.out.println(lengths);
System.out.println(uppercases);
}
}
方法和构造方法引用
List input = Arrays.asList(new String[] {"apple", "orange", "pear"});
input.forEach((v) -> System.out.println(v));
input.forEach(System.out::println);
List dateValues = Arrays.asList(new Long[] {0L, 1000L});
List dates = CollectionUtils.map(dateValues, Date::new);