注解
获取注解中的值
/**
* 自定义注解
*/
@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 表达式只能实现一个方法,因此它只能为 只有一个抽象方法的接口(函数式接口)创建对象。