lambda表达式,函数式编程,也可称为闭包,java8发布的最重要新特性。
lambda允许把函数作为一个方法的参数(函数作为参数传递进方法中)。
lambda表达式语法格式:
- param -> experession
- (x, y) -> {statments;}
lambda新特性
- 参数类型: 不需要声明参数类型,编译器可以统一识别
- 参数圆括号: 一个参数无需定义圆括号,多个参数时必须定义圆括号
- 代码块大括号: 如果主体只有一个语句,就不需要定义大括号
- 返回值: 如果主体只有一个语句,编译器默认其结果为返回值,定义大括号后需要指定返回一个数值
java内置4大核心接口:
/**
* java内置4大核心接口
*
* Consumer(T) : 消费型接口
* void accept(T t);
* 传入泛型T,无返回值
*
* Supplier<T> : 供给型接口
* T get();
* 无传入参数,返回泛型T
*
* Function<T, R> : 函数型接口
* R apply(T t);
* 传入泛型T,返回R类型返回值
*
* Predicate<T> : 断言型接口
* boolean test(T t);
* 传入泛型T,返回boolean类型
*
*/
public class FourCoreFunction {
public static void main(String[] args) {
FourCoreFunction f = new FourCoreFunction();
f.test1();
f.test2();
f.test3();
f.test4();
f.test5();
}
//Consumer(T) : 消费型接口
public void test1() {
happy(100D, e -> {
e -= 100;
System.out.println(e);
});
}
public void happy(double money, Consumer<Double> con) {
con.accept(money);
}
//Supplier<T> : 供给型接口
public void test2() {
int z = 10;
getNumArr(z, () -> {
int[] arr = new int[z];
for (int i=0; i<z; i++) arr[i] = i;
return arr;
});
}
public void test3() {
getNumList(10, () -> (int)(Math.random()*100));
}
public void getNumArr(int num, Supplier<int[]> sup) {
int[] is = sup.get();
System.out.println(Arrays.toString(is));
}
public void getNumList(int num, Supplier<Integer> sup) {
List<Integer> list = new ArrayList<>();
for (int i=0; i<num; i++) list.add(sup.get());
System.out.println(Arrays.toString(list.toArray()));
}
//Function<T, R> : 函数型接口
public void test4() {
String str = strHandler("wbx", e -> e.toUpperCase());
System.out.println(str);
}
public String strHandler(String str, Function<String, String> f) {
return f.apply(str);
}
//Predicate<T> : 断言型接口
public void test5() {
String[] strArr = {"Hello", "World", "www", "ok"};
List<String> list = Arrays.asList(strArr);
strFilter(list, e -> e.length() > 3);
}
public void strFilter(List<String> list, Predicate<String> pre) {
for (String str : list) {
if (pre.test(str)) {
System.out.println(str);
}
}
}
}