Java 8 lambda表达式和函数式编程

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) {
            }
        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

左林右李02

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值