JDK8的新特性
这两天开始看jdk8的新特性,先看了Lembda表达式和Stream,就一个感觉,优雅。
赶紧将这两天的成果总结一下
一、Lembda表达式
Lembda表达式格式
lembda表达式是一个简洁、可传递的匿名函数,实现了把代码块赋值给一个变量的功能
格式就是 (parameters) -> expression
,需要注意的是:
- 参数可以为空 ()->xxx
- 参数为一个值得时候,可以省略参数的括号 x->xxx
- 表达式只有一行的时候不需要
;
,有多行的时候需要加上;
- 表达式可以是一个数字(直接返回这个数字),一个算式;可以是普通的一个语句(无返回,相当于void)
- 参数的名不能和局部变量相同
- 表达式中直接调用的变量(不是传入的),必须是显示声明为final或事实上的final类型
函数式接口
lambda表达式的使用需要借助于函数式接口
含有且仅含有一个抽象方法的接口被称为函数式接口
需要注意的是,default
关键字可以在接口中定义实现,如果一个接口含有多个实现但是只有一个抽象方法,那么它也属于函数式接口
自定义函数式接口
一般用@FunctionInterface
对函数式接口来进行语义化标注
步骤:
- 定义一个函数式接口
@FunctionalInterface
public interface Append {
int append(int a,int b);
}
public static void main(String[] args) {
//对这个接口的抽象方法进行实现,并用该接口进行接收
Append append = ((a, b) -> a + b);
//调用这个方法
int result = append.append(1, 2);
System.out.println("result = "+result);
}
- 对这个接口的抽象方法进行实现,并用该接口进行接收,
- 调用这个方法
结果: result = 3
JDK自带的函数式接口
- Predicate
进行判断
boolean test(T t);
利用我们在外部设定的条件对于传入的参数进行校验并返回验证通过与否 - Consumer
消费者 void accept(T t);
接收参数并依据传递的行为应用传递的参数值 - Function
R apoly(T t);
执行转换操作,输入类型 T 的数据,返回 R 类型的结果
这三个是最重要的接口,其他的接口都是从这三个接口演化而来,下面我强行使用这三个接口
/*Predicate<T> 判断*/
Predicate<String> stringPredicate = str -> StringUtils.isBlank(str) || "error".equalsIgnoreCase(str);
/*Consumer<T>*/
Consumer<String> stringConsumer = str -> {
if (StringUtils.isBlank(str) || "error".equalsIgnoreCase(str)) {
System.out.println("Consumer失败");
}
};
/*Function<T,R>*/
Function<String, String> stringStringFunction = str -> {
if (StringUtils.isBlank(str) || "error".equalsIgnoreCase(str)) {
return "Function失败";
} else {
return "Function成功";
}
};
String in = "error";
if (stringPredicate.test(in)) {
System.out.println("Predicate失败");
}
stringConsumer.accept(in);
System.out.println(stringStringFunction.apply(in));
方法引用
在表达式中,可以使用::
更方便的调用方法,它会自动将参数传入,并且将返回值返回
比如System.out.println(传入参数)
可以转换为System.out::println
表达式只需要调用一个方法就可以完成功能的时候,可以用这种方法来进一步简化代码;