Java Lambda表达式与枚举
Lambda表达式概述
Java从JDK 1.8开始引入了Lambda表达式,以简化代码开发并支持函数式编程。Lambda表达式可以避免面向对象编程中的一些繁琐问题,但同时也是一把双刃剑。
Lambda表达式的使用场景
- 必须有相应的函数接口,即内部有且仅有一个抽象方法的接口。
- 类型推断机制,编译器可以根据上下文信息推断出参数列表的类型。
Lambda表达式的优点
- 匿名函数,可以写出更简洁、更灵活的代码。
- 提升了Java的语言表达能力。
Lambda表达式的演化
通过员工过滤年龄和工资的案例,感受Lambda表达式的演化与方便之处。
Lambda表达式的语法
Lambda表达式引入了->
操作符,分为两个部分:左侧的参数列表和右侧的Lambda体。
分类与格式
- 无参数,无返回值
() -> { 执行语句 }
- 有一个参数,无返回值
(变量名) -> { 执行语句 }
- 只有一个参数时,小括号可省略
变量名 -> { 执行语句 }
- 两个以上参数,有返回值,Lambda体中有多条语句
(变量名1, 变量名2) -> { 执行语句; return xxx; }
- Lambda体中只有一条语句时,可省略return和大括号
(变量名1, 变量名2) -> 要返回的结果;
- 类型推断
([类型] 变量名1, [类型] 变量名2) -> 要返回的结果;
总结口诀
上联:左右遇一括号省
下联:左侧推断类型省
横批:能省则省
Java内置函数式接口
Java在java.util.function
包下提供了多个内置函数式接口,如Predicate<T>
、Function<T,R>
、Supplier<T>
和Consumer<T>
。
Predicate 断言型接口
@FunctionalInterface
public interface Predicate<T> {
boolean test(T t);
}
Function<T,R> 函数型接口
@FunctionalInterface
public interface Function<T, R> {
R apply(T t);
}
Supplier 供给型接口
@FunctionalInterface
public interface Supplier<T> {
T get();
}
Consumer 消费型接口
@FunctionalInterface
public interface Consumer<T> {
void accept(T t);
}
Lambda用法再简洁之方法引用
对象引用
对象引用::实例方法名
类引用
类名::静态方法名
类::实例方法名
变量1对应的类名::实例方法名
构造方法引用
类名::new
数组引用
元素类型[]::new
误区
Lambda表达式并不是匿名内部类的实现,而是通过invokedynamic
指令调用。
小结
Lambda表达式的优点是可以减少代码量,节省内存占用,但易读性较差,不方便调试。
新特性2:枚举
枚举概述
枚举类型用于统一管理有限的常量数据,提高代码的可读性和简洁性。
JDK1.5之前使用枚举
- 创建枚举类的属性必须是私有常量。
- 构造方法必须私有化。
- 提供公共的静态final方法获取枚举对象。
- 提供公共的获取属性的方法。
- 重写
toString()
方法。
JDK1.5之后使用枚举
- 枚举对象放在开头。
- 创建枚举类的属性必须是私有常量。
- 构造方法必须私有化。
- 提供公共的获取属性的方法。
- 重写
toString()
方法。
枚举类实现接口
枚举类可以实现接口,并且枚举中的每个对象可以单独实现接口。
/*
1. 创建枚举类的属性(成员遍历),必须是作为私有常量出现
2. 必须将构造方法私有化,这是为了保证类的对象是有限个的目的
3. 提供公共的静态的final方法给外界获取枚举类中多个对象
4. 提供公共的获取属性的方法
5. 重写toString()方法
*/
class Season{
//1. 创建枚举类的属性(成员遍历),必须是作为私有常量出现
private String name;
private String info;
//2. 必须将构造方法私有化,这是为了保证类的对象是有限个的目的
private Season(String name, String info){
this.name = name;
this.info = info;
}
//3. 提供公共的静态的final方法给外界获取枚举类中多个对象
public static final Season SPRING = new Season("春天","春暖花开");
public static final Season SUMMER = new Season("夏天","烈日炎炎");
public static final Season AUTUMN = new Season("秋天","秋高气爽");
public static final Season WINTER = new Season("冬天","白雪皑皑");
//4. 提供公共的获取属性的方法
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getInfo() {
return info;
}
public void setInfo(String info) {
this.info = info;
}
@Override
public String toString() {
return "Season{" +
"name='" + name + '\'' +
", info='" + info + '\'' +
'}';
}
}
public class SeasonDemo1 {
public static void main(String[] args) {
Season spring = Season.SPRING;
Season summer = Season.SUMMER;
}
}
/*
jdk1.5之后 java提供了一个关键字用于创建枚举类 enum
*/
enum Season2{
//jdk1.5之后必须将有限个对象放在enum枚举类第一个开头位置,多个对象之间使用逗号隔开
SPRING("春天","春暖花开"),
SUMMER("夏天","烈日炎炎"),
AUTUMN("秋天","秋高气爽"),
WINTER("冬天","白雪皑皑");
//1. 创建枚举类的属性(成员遍历),必须是作为私有常量出现
private String name;
private String info;
//2. 必须将构造方法私有化,这是为了保证类的对象是有限个的目的
private Season2(String name, String info){
this.name = name;
this.info = info;
}
//4. 提供公共的获取属性的方法
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getInfo() {
return info;
}
public void setInfo(String info) {
this.info = info;
}
@Override
public String toString() {
return "Season{" +
"name='" + name + '\'' +
", info='" + info + '\'' +
'}';
}
}
public class SeasonDemo2 {
public static void main(String[] args) {
Season2 spring = Season2.SPRING;
System.out.println(spring.getName());
System.out.println(spring.getInfo());
}
}
标签:info,name,枚举,Lambda,public,表达式,String
From: https://www.cnblogs.com/bjynjj/p/18475044