枚举
1.概述
枚举是指将变量的值一一列出来,而且变量的值只限于列举出来的值的范围内。比如:一周只有7 天。
2.枚举的基础代码
package com.darksnow.enums;
public enum Direction {
FRONT,
BEHIND,
LEFT,
RIGHT;
}
3.枚举代码演示
package com.darksnow.enums;
public enum Direction {
FRONT("前" ) {
@Override
public void show () {
System.out.println("这个是前~" );
}
},
BEHIND("后" ) {
@Override
public void show () {
System.out.println("这个是后~" );
}
},
LEFT("左" ) {
@Override
public void show () {
System.out.println("这个是左~" );
}
},
RIGHT("右" ) {
@Override
public void show () {
System.out.println("这个是右~" );
}
};
private String name;
private Direction (String name) {
this .name = name;
}
public String getName () {
return name;
}
public abstract void show () ;
}
package com.darksnow.enums;
public class EnumTest {
public static void main (String[] args) {
System.out.println(Direction.BEHIND);
System.out.println(Direction.BEHIND.getName());
Direction.BEHIND.show();
}
}
4.枚举注意事项
1. 定义枚举类要用关键字enum
2. 所有枚举类都是Enum的子类
3. 枚举类的第一行上必须是枚举项,最后一个枚举项后面的分号是可以省略的,但是如果枚举类有其他的东西,这个分号就不可能省略,建议不要去省略。
4. 枚举项的命名全字母大写,因为底层本质上是一个常量。
5. 枚举类可以有构造函数,但是必须是被private 修饰的,它默认的也是private 的
6. 枚举类也可以有抽象方法,但是枚举项必须重写该抽象方法
7. 枚举可以在switch 语句中使用
例子:
public class EnumTest {
public static void main (String[] args) {
Direction d = Direction.BEHIND;
switch (d) {
case FRONT:
System.out.println("匹配到了前" );
break ;
case BEHIND:
System.out.println("匹配到了后" );
break ;
case LEFT:
System.out.println("匹配到了左" );
break ;
}
}
}
5.Enum类的方法
package com.darksnow.enums;
public class EnumTest {
public static void main (String[] args) {
Direction direction1 = Direction.FRONT;
Direction direction2 = Direction.BEHIND;
Direction direction3 = Direction.LEFT;
Direction direction4 = Direction.RIGHT;
System.out.println(direction1.compareTo(direction1));
System.out.println(direction1.compareTo(direction4));
System.out.println(direction4.compareTo(direction1));
System.out.println("--------------------------" );
System.out.println(direction1.name());
System.out.println(direction2.name());
System.out.println(direction3.name());
System.out.println(direction4.name());
System.out.println("--------------------------" );
System.out.println(direction1.ordinal());
System.out.println(direction2.ordinal());
System.out.println(direction3.ordinal());
System.out.println(direction4.ordinal());
System.out.println("--------------------------" );
System.out.println(direction1.toString());
System.out.println(direction2.toString());
System.out.println(direction3.toString());
System.out.println(direction4.toString());
System.out.println("--------------------------" );
Direction[] values = Direction.values();
for (Direction d : values) {
System.out.println(d);
System.out.println(d.getName());
}
Direction d = Enum.valueOf(Direction.class, "BEHIND" );
}
}
注解
1.概念
注解(Annotation),JDK5.0 出现的。
作用:
它是对程序作出结实,可以被其他程序读取。
格式:
以"@注解名" 格式存在的,注解也是可以有参数的
在什么地方使用:
可以在package ,class ,method ,field 上使用
2.内置注解
内置注解就是jdk本身定义好的除元注解以外的注解
@Override,此注解用于修饰方法,表示一个方法将重写父类的另外一个方法
@Deprecated,此注解用于修饰方法,属性,类,表示不推荐使用(弃用 )
@SuppressWarnings,用于压制黄色警告信息
3.元注解
元注解的作用是负责注解其他注解,Java中定义了4 个元注解
@Target:用于表述注解的使用范围,说白了就是描述注解能够用在什么地方。
@Retention:表示需要在什么级别保存该注解信息,就是描述注解的生命周期(存活时长 )
SOURCE(源代码级别) < CLASS(类级别) < RUNTIME(运行级别) 一般用RUNTIME,其他的你不管。
@Documented:表示注解将会被包含在JavaDoc中
@Inherited:表示子类可以继承父类中的该注解
package com.darksnow.enums;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target(value = {ElementType.TYPE,ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface MyAnnotation {
}
package com.darksnow.enums;
@MyAnnotation
public class UseAnnotation {
@MyAnnotation
public void test () {
}
}
4.自定义注解
使用@interface 自定义注解时,自动继承了java.lang.annotation.Annotation接口
注意点:
(1 )@interface 用来声明一个注解,格式:
public @interface 注解名{
定义的内容
}
(2 )注解中的每一个方法实际上是声明了一个配置参数
(3 )方法的名称就是参数的名称
(4 )方法返回值类型就是参数的类型(返回值类型只能是基本数据类型,Class,String,enum ,数组)
(5 )default 可以用来表示当前注解参数的默认值,当存在默认的时候,你可以不配置该属性
(6 )如果某个注解只有一个参数,那么参数名一般起名为value
(7 )注解的参数必须要有值(可以用default 定义默认值,也可以在使用该注解时指定值),我们定义注解参数的时候,经常用空字符
串,0 作为默认值
--------------------------------------------------------------------
package com.darksnow.enums;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Documented
@Retention(value = RetentionPolicy.RUNTIME)
@Target(value = {ElementType.METHOD})
public @interface MyAnnotation {
String value () default "" ;
String name () default "默认值" ;
int [] numbers();
}
class AnnotationTest {
@MyAnnotation(numbers = {1,2,3,4,5,6})
public void test () {
}
}
5.自定义注解案例
package com.darksnow.enums;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import java.lang.reflect.Field;
@Documented
@Retention(value = RetentionPolicy.RUNTIME)
@Target(value = {ElementType.FIELD})
public @interface MyAnnotation {
String value () ;
}
@Documented
@Retention(value = RetentionPolicy.RUNTIME)
@Target(value = {ElementType.TYPE})
@interface IsEnableMyAnnotation{
boolean value () default false ;
}
@IsEnableMyAnnotation(value = true)
class Student {
@MyAnnotation("DarkSnow")
private String name;
private String address;
@Override
public String toString () {
return "Student [name=" + name + ", address=" + address + "]" ;
}
}
class Test {
public static void main (String[] args) throws Exception {
Student s = new Student ();
Class<? extends Student > c = s.getClass();
IsEnableMyAnnotation annotation = c.getAnnotation(IsEnableMyAnnotation.class);
boolean isEnableMyAnnotationValue = annotation.value();
Field name = c.getDeclaredField("name" );
name.setAccessible(true );
MyAnnotation myAnnotation = name.getAnnotation(MyAnnotation.class);
String myAnnotationValue = myAnnotation.value();
if (isEnableMyAnnotationValue) {
name.set(s, myAnnotationValue);
}
System.out.println(s);
}
}
Lambda表达式
1.案例
package com.darksnow.lambda;
public class LambdaDemo {
public interface AddNumber {
int add (int x,int y) ;
}
public static void useAddNumber (AddNumber addNumber) {
int sum = addNumber.add(6 , 8 );
System.out.println(sum);
}
public interface Test {
void run (String str) ;
}
public static void useTest (Test test) {
test.run("代码运行了~" );
}
public static void main (String[] args) {
useAddNumber(new AddNumber () {
@Override
public int add (int x, int y) {
return x + y;
}
});
useAddNumber((int x,int y) -> {
return x + y;
});
useAddNumber((x,y) -> {
return x + y;
});
useAddNumber((x,y) -> x + y);
System.out.println("-----------" );
useTest((String str) -> {
System.out.println(str);
});
useTest(str -> {
System.out.println(str);
});
useTest(str -> System.out.println(str));
}
}
2.Lambda表达式与匿名内部类的区别
需要的类型不同
匿名内部类:可以是接口,也可以是抽象类,还可以是具体的类
Lambda表达式:只能是接口
实现的原理不同
匿名内部类:编译之后,会产生一个字节码文件
Lambda表达式:编译之后,不会产生字节码文件,对应的字节码文件会在运行时被动态生成
使用的限制不同
接口中只能有一个抽象方法,匿名内部类和Lambda都能使用
接口中有多个抽象方法,Lambda表达式不能使用,但是可以使用匿名内部类
3.引用符
3.1 引用类方法
package com.darksnow.lambda;
interface Converter {
int stringConverterInt (String number) ;
}
public class LambdaDemo {
public static void useStringConverterInt (Converter converter) {
int number = converter.stringConverterInt("8" );
System.out.println(number);
}
public static void main (String[] args) {
useStringConverterInt(new Converter () {
@Override
public int stringConverterInt (String number) {
return Integer.parseInt(number);
}
});
useStringConverterInt(number -> Integer.parseInt(number));
useStringConverterInt(Integer::parseInt);
}
}
3.2 引用对象的实例方法
package com.darksnow.lambda;
class PrintString {
public void printUpper (String str) {
String result = str.toUpperCase();
System.out.println(result);
}
}
interface Printer {
void printUpperCase (String str) ;
}
public class LambdaDemo {
public static void usePrinter (Printer p) {
p.printUpperCase("darksnow" );
}
public static void main (String[] args) {
PrintString printString = new PrintString ();
usePrinter(new Printer () {
@Override
public void printUpperCase (String str) {
printString.printUpper(str);
}
});
usePrinter(str -> printString.printUpper(str));
usePrinter(printString::printUpper);
}
}
3.3 引用类的实例方法
package com.darksnow.lambda;
interface MyString {
String mySubString (String str, int start, int end) ;
}
public class LambdaDemo {
public static void useMySubString (MyString myString) {
String result = myString.mySubString("darksnow" , 0 , 4 );
System.out.println(result);
}
public static void main (String[] args) {
useMySubString(new MyString () {
@Override
public String mySubString (String str, int start, int end) {
return str.substring(start,end);
}
});
useMySubString( (str, start, end) -> str.substring(start,end));
useMySubString(String :: substring);
}
}
4.函数式接口
函数式接口是为了Lambda 表达式服务的
是接口,且内部只有一个抽象方法,那么这个接口就为函数式接口(接口上有一个注解:@FunctionalInterface )
往深层次说,实现接口需要覆盖抽象方法,而且接口中有多个抽象方法,但只有一个抽象方法需要被覆盖
JDK1 .8 起,提供了一些函数式接口:Supplier 接口,Consumer 接口,Predicate 接口,Function 接口
Stream流
它跟I /O流没有半毛线关系,不具备I /O流的性质,Stream是于集合的。
1.Stream流常见的生成方式
package com.darksnow.stream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map.Entry;
import java.util.stream.Stream;
public class StreamDemo {
public static void main (String[] args) {
Stream<String> stream1 = new ArrayList <String>().stream();
Stream<String> stream2 = new HashSet <String>().stream();
Stream<String> stream3 = new HashMap <String,String>().keySet().stream();
Stream<String> stream4 = new HashMap <String,String>().values().stream();
Stream<Entry<String, String>> stream5 = new HashMap <String,String>().entrySet().stream();
int [] arr = {1 ,3 ,5 ,7 ,9 };
Stream<int []> stream6 = Stream.of(arr);
Stream<Integer> stream7 = Stream.of(2 ,4 ,6 ,8 ,10 );
}
}
2.filter方法
package com.darksnow.stream;
import java.util.ArrayList;
public class StreamDemo {
public static void main (String[] args) {
ArrayList<String> list = new ArrayList <String>();
list.add("阿伟" );
list.add("坂田" );
list.add("小鱼" );
list.add("小杰哥" );
list.add("汪精卫" );
list.add("大前门" );
list.add("明月" );
list.stream().filter(element -> element.startsWith("小" )).forEach(System.out::println);
System.out.println("-----------------------" );
list.stream().filter(element -> element.length() == 3 ).forEach(System.out::println);
System.out.println("-----------------------" );
list.stream().filter(element -> element.startsWith("小" ))
.filter(element -> element.length() == 2 )
.forEach(System.out::println);
}
}
3.limit&skip方法
package com.darksnow.stream;
import java.util.ArrayList;
public class StreamDemo {
public static void main (String[] args) {
ArrayList<String> list = new ArrayList <String>();
list.add("阿伟" );
list.add("坂田" );
list.add("小鱼" );
list.add("小杰哥" );
list.add("汪精卫" );
list.add("大前门" );
list.add("明月" );
list.stream().limit(3 ).forEach(System.out::println);
System.out.println("-----------------------" );
list.stream().skip(3 ).forEach(System.out::println);
System.out.println("-----------------------" );
list.stream().skip(2 ).limit(2 ).forEach(System.out::println);
}
}
4.concat&distinct方法
package com.darksnow.stream;
import java.util.ArrayList;
import java.util.stream.Stream;
public class StreamDemo {
public static void main (String[] args) {
ArrayList<String> list = new ArrayList <String>();
list.add("阿伟" );
list.add("坂田" );
list.add("小鱼" );
list.add("明月" );
list.add("小杰哥" );
list.add("汪精卫" );
list.add("大前门" );
list.add("明月" );
Stream<String> s1 = list.stream().limit(4 );
Stream<String> s2 = list.stream().skip(2 );
Stream.concat(s1, s2).distinct().forEach(System.out::println);
}
}
5.map&mapToInt方法
package com.darksnow.stream;
import java.util.ArrayList;
public class StreamDemo {
public static void main (String[] args) {
ArrayList<String> list = new ArrayList <String>();
list.add("10" );
list.add("20" );
list.add("30" );
list.add("40" );
list.add("50" );
list.stream().map(Integer::parseInt).forEach(System.out::println);
System.out.println("------------------------" );
int result = list.stream().mapToInt(Integer::parseInt).sum();
System.out.println(result);
}
}
6.Stream流终结操作方法(count&forEach)
package com.darksnow.stream;
import java.util.ArrayList;
import java.util.LinkedList;
public class StreamDemo {
public static void main (String[] args) {
ArrayList<String> list = new ArrayList <String>();
list.add("阿伟" );
list.add("坂田" );
list.add("小鱼" );
list.add("明月" );
list.add("小杰哥" );
list.add("汪精卫" );
list.add("大前门" );
list.add("明月" );
list.stream().forEach(System.out::println);
System.out.println("--------------------------" );
list.forEach(System.out::println);
System.out.println("--------------------------" );
long count = list.stream().filter(str -> str.startsWith("小" )).count();
System.out.println(count);
}
}
7.sorted方法
package com.darksnow .stream ;
import java.util .TreeSet ;
public class StreamDemo {
public static void main (String [] args ) {
TreeSet <String > list = new TreeSet <String >();
list.add ("mingyue" );
list.add ("xiaoyu" );
list.add ("kunkun" );
list.add ("dahua" );
list.add ("mingyue" );
list.add ("liwei" );
list.stream ().sorted ().forEach (System .out ::println);
System .out .println ("--------------------------------------" );
list.stream ().sorted ((o1,o2) -> o1.length ()-o2.length ()).forEach (System .out ::println);
}
}
8.Stream流的收集操作
package com.darksnow.stream;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.stream.Collectors;
import java.util.stream.Stream;
public class StreamDemo {
public static void main (String[] args) {
ArrayList<String> list = new ArrayList <String>();
list.add("刘诗诗" );
list.add("杨幂" );
list.add("柳岩" );
list.add("林志玲" );
list.add("杨紫" );
list.add("赵丽颖" );
Stream<String> listStream = list.stream().filter(str -> str.length() == 3 );
Set<String> set = listStream.collect(Collectors.toSet());
System.out.println(set);
String[] strArr = {"阿伟,60" ,"坂田,70" ,"坤坤,80" };
Stream<String> strStream = Stream.of(strArr);
Map<String, String> map = strStream.collect(Collectors.toMap(str -> str.split("," )[0 ], str -> str.split("," )[1 ]));
System.out.println(map);
}
}
Lambda表达式案例
package com.darksnow.lambda;
interface Inter {
void test (String str) ;
}
public class LambdaDemo01 {
public static void useTest (Inter inter) {
inter.test("testing..." );
}
public static void main (String[] args) {
useTest(new Inter () {
@Override
public void test (String str) {
System.out.println(str);
}
});
useTest(str -> System.out.println(str));
useTest(System.out::println);
}
}
package com.darksnow.lambda;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
public class LambdaDemo02 {
public static void main (String[] args) {
List<String> list = new ArrayList <>();
list.add("ddddd" );
list.add("aa" );
list.add("ccc" );
list.add("bbbb" );
System.out.println(list);
Collections.sort(list,mySort());
System.out.println(list);
}
public static Comparator<String> mySort () {
return (o1,o2) -> o1.length() - o2.length();
}
}
package com.darksnow.lambda;
interface Calculator {
int calculate (int a,int b) ;
}
class Compute {
public int binaryOperate (int a, int b, Calculator calculator) {
return calculator.calculate(a, b);
}
}
public class LambdaDemo03 {
public static void main (String[] args) {
int result = new Compute ().binaryOperate(2 ,2 ,new Calculator () {
@Override
public int calculate (int a, int b) {
return a*a + b*b;
}
});
System.out.println(result);
int rs = new Compute ().binaryOperate(2 ,2 ,(a,b) -> a*a + b*b);
System.out.println(rs);
}
}
package com.darksnow.lambda;
public class Test {
public static void main (String[] args) {
new Thread (new Runnable () {
@Override
public void run () {
System.out.println(Thread.currentThread().getName());
}
}).start();
new Thread (() -> System.out.println(Thread.currentThread().getName())).start();
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY