杭州网站建设icp备,品牌推广与传播,公司营销网络怎么写,网站开发招聘需要文章目录Ⅰ. 枚举类定义与使用Ⅱ. 枚举类的构造方法默认就是 private总结Ⅲ. 什么是 Lambda 表达式Ⅳ. Lambda 表达式的使用列表排序的常用写法1. **基本比较#xff08;数值#xff09;**Integer.compare(a, b)2. **方法引用 ** **Comparator.comparing**3. **多条件排序**4…文章目录Ⅰ. 枚举类定义与使用Ⅱ. 枚举类的构造方法默认就是 private总结Ⅲ. 什么是 Lambda 表达式Ⅳ. Lambda 表达式的使用列表排序的常用写法1. **基本比较数值**Integer.compare(a, b)2. **方法引用 ** **Comparator.comparing**3. **多条件排序**4. **倒序排序**5. **处理 null 值**6. **字符串比较忽略大小写**7. **完全自定义规则**Ⅰ. 枚举类定义与使用publicenumColor{RED,GREEN,BLUE,YELLOW,ORANGE,PURPLE,PINK,BROWN,BLACK,WHITE;}每个我们写的enum类都会默认继承于一个抽象类Enum如下图所示而这个Enum抽象类中有挺多方法如下所示下面是使用举例publicstaticvoidmain(String[]args){// 使用Color.RED直接访问枚举元素或者直接RED都行但不能使用new来生成枚举类对象ColorcolorColor.RED;System.out.println(color.name());// 输出颜色名称System.out.println(color.ordinal());// 输出颜色的序号System.out.println(color);// 直接输出颜色对象System.out.println(color.describeConstable());// 输出颜色的描述信息System.out.println(Color.valueOf(BLACK));// 通过名称获取枚举值// 有个比较特殊的是values()方法它可以返回所有枚举值数组它不存在Enum中而是在编译时由编译器生成的。// 但是如果枚举值太多可能导致内存溢出所以一般不用这个方法。System.out.println(----------------------输出所有枚举元素);Color[]colorsColor.values();for(inti0;icolors.length;i){System.out.println(colors[i] colors[i].ordinal());}Colorc2newColor();// ❌不能实例化枚举类只能通过枚举值访问其属性和方法。}// 运行结果RED0REDOptional[EnumDesc[Color.RED]]BLACK----------------------输出所有枚举元素 RED0GREEN1BLUE2YELLOW3ORANGE4PURPLE5PINK6BROWN7BLACK8WHITE9这里要注意values()是由Java编译器为每个枚举类自动生成的静态方法所以在Enum类里是找不到它的源码的但每个具体的枚举类都有它。还有就是枚举类内也可以有方法并且这些方法只能通过枚举元素来调用而不能直接通过枚举类名来调用如下图所示Ⅱ. 枚举类的构造方法默认就是private枚举类的构造方法是隐式private的是为了保证枚举常量的唯一性避免外部创建新的实例防止破坏enum的封闭性在某些场景下天然实现单例模式并且是线程安全的、防反射、防反序列化首先枚举类也是可以写构造函数然后枚举元素可以进行构造如下所示publicenumColor{RED(red,1),GREEN(green,2),BLUE(blue,3);privateStringname;privateintvalue;// 构造函数默认就是private不写也可以但是不能写其它的访问权限privateColor(Stringname,intvalue){this.namename;this.valuevalue;}publicstaticvoidmain(String[]args){ColorcColor.RED;System.out.println(c.name);System.out.println(c.value);}}// 运行结果red1然后测试一下不同对象引用同一个枚举元素是不是同一地址publicstaticvoidmain(String[]args){Colorc1Color.RED;Colorc2Color.RED;System.out.println(c1c2);// true}很明显不同对象引用同一个枚举元素都是同一个对象。然后看一下是不是能够在类内调用构造方法publicstaticvoidmain(String[]args){ColorcnewColor();// ❌报错无法实例化枚举类型}那么就想能不能用反射来设置访问权限强制调用构造方法如下所示publicstaticvoidmain(String[]args){try{// 先获取构造函数再设置Accessible为trueClass?csClass.forName(EnumDemo.Color);Constructor?ctorcs.getDeclaredConstructor(String.class,int.class);ctor.setAccessible(true);// 调用构造函数创建对象Colorc(Color)ctor.newInstance(yellow,4);System.out.println(c.name c.value);}catch(ClassNotFoundExceptione){thrownewRuntimeException(e);}catch(InvocationTargetExceptione){thrownewRuntimeException(e);}catch(NoSuchMethodExceptione){thrownewRuntimeException(e);}catch(InstantiationExceptione){thrownewRuntimeException(e);}catch(IllegalAccessExceptione){thrownewRuntimeException(e);}}然后报了如下错误其实这个参数错误是因为每个枚举类都默认继承了Enum而Enum类的构造方法又有两个参数如下所示这时就需要一起放在我们的枚举类的参数列表中传入才行Constructor?ctorcs.getDeclaredConstructor(String.class,int.class,String.class,int.class);解决上述问题之后此时又有一个错误如下所示点击第二行跳转过去看看源码总结Enum类同样有构造方法但一定得是private修饰。Enum类的每一个枚举元素都是【单例】。Enum类型的类不能通过调用【构造方法】来创建实例。Enum类型的类不能通过【反射】来创建新的实例因为Enum的实例在编译时就已经确定且JVM保证了这些实例的唯一性。Ⅲ. 什么是Lambda表达式Lambda表达式是JavaSE8中一个重要的新特性它允许通过表达式来代替功能接口。Lambda表达式和方法一样它提供了一个正常的参数列表和一个使用这些参数的主体可以是一个表达式或一个代码块)。基本语法如下所示(parameters)-expression 或者(parameters)-{statements;}举一些例子// 1. 不需要参数返回值为 2()-2// 2. 接收⼀个参数返回其2倍的值x-2*x// 3. 接受2个参数并返回他们的和(x,y)-xy// 4. 接收2个int型整数返回他们的乘积(intx,inty)-x*y// 5. 接受⼀个 string 对象并在控制台打印不返回任何值(Strings)-System.out.print(s)函数式接口定义一个接口且其中只有一个抽象方法可以包含普通方法。注意如果我们在某个接口上声明了FunctionalInterface注解那么编译器就会按照函数式接口的定义来要求该接口这样如果有两个抽象方法程序编译就会报错的。举个例子FunctionalInterfaceinterfaceNoParameterNoReturn{voidtest();// 合法可以有普通方法defaultvoidtest2(){System.out.println(JDK1.8新特性default默认⽅法可以有具体的实现);}}Ⅳ.Lambda表达式的使用FunctionalInterfaceinterfaceMyInterface1{voidmyMethod();}FunctionalInterfaceinterfaceMyInterface2{intmyMethod(inta,intb);}publicclassdemo2{publicstaticvoidmain(String[]args){MyInterface1myif1()-System.out.println(无参无返回值方法);myif1.myMethod();MyInterface2myif2(a,b)-ab;System.out.println(有参数有返回值myif2.myMethod(2,3));}}☠ 注意事项参数类型可以省略。如果需要省略每个参数的类型都要省略。参数的小括号里面只有一个参数那么小括号可以省略如果方法体当中只有一句代码那么大括号可以省略如果方法体中只有一条语句且是return语句那么大括号可以省略且去掉return关键字。lambda表达式捕获变量的规则和匿名内部类是一样的具体可以参考匿名内部类笔记lambda表达式是“函数式接口” 的一个匿名实现对象区分开以下两者的区别// Runnable是一个函数式接口需要重写里面的run()方法Runnabler()-System.out.println(Hello, Lambda!);// Thread只是一个类但是可以Thread(Runnable r)来构造所以才需要new Thread然后回到上面的问题ThreadtnewThread(()-System.out.println(work));列表排序的常用写法1.基本比较数值Integer.compare(a, b)安全的数值比较避免溢出list.sort((p1,p2)-Integer.compare(p1.getAge(),p2.getAge()));适用于int,double,long等基本类型数值比较安全性优先避免a - b的溢出问题2.方法引用 Comparator.comparing最简洁可读的写法list.sort(Comparator.comparing(Person::getAge));优点语义明确别人一看就知道是按年龄排序支持链式调用.thenComparing(...)3.多条件排序list.sort(Comparator.comparing(Person::getAge).thenComparing(Person::getName));场景先按主条件排年龄如果相同再按次条件名字4.倒序排序两种常见方式// 方式1reversed()list.sort(Comparator.comparing(Person::getAge).reversed());// 方式2负数技巧不推荐大数list.sort((p1,p2)-Integer.compare(p2.getAge(),p1.getAge()));5.处理 null 值list.sort(Comparator.comparing(Person::getAge,Comparator.nullsLast(Integer::compareTo)));说明nullsFirst→ null 在最前面nullsLast→ null 在最后面6.字符串比较忽略大小写list.sort(Comparator.comparing(Person::getName,String.CASE_INSENSITIVE_ORDER));7.完全自定义规则当规则复杂比如特殊业务逻辑时list.sort((p1,p2)-{if(p1.getAge()p2.getAge()){returnp1.getName().length()-p2.getName().length();}returnp1.getAge()-p2.getAge();});