java lambda表达式
Lambda 表达式是 Java 8 中引入的一个新特性,它可以用更加简洁的语法来表示匿名函数。Lambda 表达式可以作为参数传递给方法,也可以作为返回值返回。Lambda 表达式的语法如下:
(parameters) -> expression
或者
(parameters) -> { statements; }
其中,parameters
表示 Lambda 表达式的参数列表,可以为空或者包含多个参数,多个参数之间使用逗号分隔。expression
表示 Lambda 表达式的执行体,可以是一个表达式或者一个语句块。如果 expression
是一个表达式,则 Lambda 表达式会自动返回该表达式的值。如果 expression
是一个语句块,则需要使用 return
语句来返回值。
下面是一个简单的 Lambda 表达式的例子:
List<String> names = Arrays.asList("Alice", "Bob", "Charlie");
names.forEach(name -> System.out.println(name));
这个例子中,names
是一个包含多个字符串的列表。names.forEach
方法接受一个 Lambda 表达式作为参数,用于对列表中的每个元素进行操作。Lambda 表达式 name -> System.out.println(name)
表示对每个元素执行 System.out.println(name)
操作,即输出元素的值。
Lambda 表达式可以帮助开发者编写更加简洁、可读性更高的代码。它可以替代匿名内部类,使代码更加简洁。同时,Lambda 表达式还可以作为参数传递给方法,使代码更加灵活。
Lambda 表达式作为参数传递给方法(和函数式编程结合使用)
lambda表达式通常会让代码简洁的同时更易读,但是有一种情况例外,就是Lambda 表达式作为参数传递给方法,下面是一个例子
public class MetricsAspect {
/**
* Prometheus指标管理
*/
private MeterRegistry registry;
//定义一个函数,入参是ProceedingJoinPoint,出参是Tag集合
private Function<ProceedingJoinPoint, Iterable<Tag>> tagsBasedOnJoinPoint;
public MetricsAspect(MeterRegistry registry) {
//此处初始化函数,该函数是一个lambda表达式
//这里如果不熟悉lambda表达式,会比较迷惑,可能会问pjp是从哪来的
this.init(registry, pjp -> Tags
.of(new String[]{"class", pjp.getStaticPart().getSignature().getDeclaringTypeName(), "method",
pjp.getStaticPart().getSignature().getName()}));
}
public void init(MeterRegistry registry, Function<ProceedingJoinPoint, Iterable<Tag>> tagsBasedOnJoinPoint) {
this.registry = registry;
this.tagsBasedOnJoinPoint = tagsBasedOnJoinPoint;
}
/**
* 针对@Tp指标配置注解的逻辑实现
*/
@Around("@annotation(com.yxm.badminton.util.annotation.Tp)")
public Object timedMethod(ProceedingJoinPoint pjp) throws Throwable {
Method method = ((MethodSignature) pjp.getSignature()).getMethod();
method = pjp.getTarget().getClass().getMethod(method.getName(), method.getParameterTypes());
Tp tp = method.getAnnotation(Tp.class);
Timer.Sample sample = Timer.start(this.registry);
String exceptionClass = "none";
try {
return pjp.proceed();
} catch (Exception ex) {
exceptionClass = ex.getClass().getSimpleName();
throw ex;
} finally {
try {
String finalExceptionClass = exceptionClass;
//创建定义计数器,并设置指标的Tags信息(名称可以自定义)
Timer timer = Metrics.newTimer("tp.method.timed",
builder -> builder.tags(new String[]{"exception", finalExceptionClass})
.tags(this.tagsBasedOnJoinPoint.apply(pjp)).tag("description", tp.description())
.publishPercentileHistogram().register(this.registry));
sample.stop(timer);
} catch (Exception exception) {
}
}
}
}