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) {
            }
        }
    }
}

你可能感兴趣的:(java,python,开发语言)