注解
获取注解中的值
/** * 自定义注解 */ @Target({ElementType.TYPE,ElementType.METHOD}) @Retention(RetentionPolicy.RUNTIME) public @interface MyAnno { String value() default "admin"; // String value(); // int age(); } //若注解属性没有给定属性值,那么需要在使用时给定属性值 //@MyAnno(value = "test",age = 18) //如果注解中有且只有一个注解,并且属性名称叫做value,使用注解是可以不写属性名称的 @MyAnno("test") public class Test { } /** * 获取注解中的值 */ public class GetAnnoValueDemo { public static void main(String[] args) { Class<Test> clazz = Test.class; MyAnno myAnno = clazz.getDeclaredAnnotation(MyAnno.class); System.out.println(myAnno.value()); } }
Lambda
Lambda表达式构成
-
形参列表:Java编译器可以自动推断参数类型,因此可以省略参数的数据类型,其次,如果参数列表只有1个参数时,小括号可以省略
-
箭头函数:->必须有横线和大于号组成
-
代码块。如果代码块只包含一条语句,Lambda表达式允许省略代码块的花括号。
示例:
@FunctionalInterface public interface MyConsumer { void test(); private void test2(){ } static void test3(){ } static void test4(){ } default void test5(){ System.out.println(50); } } public class MyConsumerTest { public void consumer(MyConsumer consumer){ consumer.test(); System.out.println("执行MyConsumerTest中的consumer方法"); } } /** * Lambda表达式练习 */ public class LambdaDemo { public static void main(String[] args) { //创建不可变集合 List<String> list = List.of("张麻子","师爷","黄老爷"); list.forEach((t)-> System.out.println(t)); MyConsumerTest myConsumerTest = new MyConsumerTest(); myConsumerTest.consumer(()->{ System.out.println("执行Lambda表达式"); }); MyConsumer myConsumer = ()->{ System.out.println("执行Lambda表达式"); }; myConsumer.test(); // MyConsumer myConsumer = new MyConsumer() { // @Override // public void test() { // test5(); // } // }; myConsumer.test5(); } }
注意事项:
-
Lambda 表达式的目标类型必须是明确的函数式接口。
-
Lambda 表达式只能为函数式接口创建对象。Lambda 表达式只能实现一个方法,因此它只能为 只有一个抽象方法的接口(函数式接口)创建对象。
函数式接口
所谓函数式接口,就是接口中有且只能有一个抽象方法。用@FunctionalInterface注解标注,接口可以包含多个默认方法、类方法,私有方法。