JDK1.8新特性之方法引用 ::
简介
方法引用是一种比Lambda表达式更简洁易读的代码编写方式,它可以将已有的方法作为值传递,并将其应用到函数式接口中。方法引用的核心操作符是 ::
,它可以引用一个方法或构造函数。
使用方法
方法引用可以拆分成两个部分:方法或构造函数的引用和方法类型的定义。方法或构造函数的引用可以是以下三种形式之一:
- 静态方法引用:
ClassName::staticMethodName
- 实例方法引用:
objectName::instanceMethodName
- 构造函数引用:
ClassName::new
方法类型的定义可以是以下三种形式之一:
- 无参方法
- 带一个参数方法
- 带多个参数方法
示例
静态方法引用:
假设有一个接口 MyInterface
,其中定义了一个无参方法 myMethod
:
public interface MyInterface {
void myMethod();
}
现在我们有一个静态方法 doSomething
:
public static void doSomething() {
System.out.println("Do Something!");
}
那么我们可以使用静态方法引用将 doSomething
方法绑定到 myMethod
上,代码如下:
MyInterface mi = Main::doSomething;
// 调用 myMethod
mi.myMethod();
实例方法引用:
同样假设有一个接口 MyInterface
:
public interface MyInterface {
void printMsg(String msg);
}
我们有一个类 MyClass
,其中定义了方法 print
:
public class MyClass {
public void print(String msg) {
System.out.println(msg);
}
}
现在我们可以使用实例方法引用将 MyClass
的实例方法 print
绑定到 MyInterface
的方法 printMsg
上,代码如下:
MyClass mc = new MyClass();
MyInterface mi = mc::print;
// 调用 printMsg
mi.printMsg("Hello, world!");
构造函数引用:
我们可以使用构造函数引用来创建新的对象。假设有一个类 Person
:
public class Person {
private String name;
public Person(String name) {
this.name = name;
}
public String getName() {
return name;
}
}
我们可以使用构造函数引用来快速创建 Person
对象,代码如下:
Supplier<Person> personSupplier = Person::new;
Person p1 = personSupplier.get();
Person p2 = personSupplier.get();
// 输出 p1.getName() 和 p2.getName()
System.out.println(p1.getName());
System.out.println(p2.getName());
Optional详解
简介
在JDK1.8中,新增了一个 Optional 类,它是一个容器对象,可以包含 null 或者非 null 的值。使用 Optional 类能有效地避免一些空指针异常的问题。
使用方法
Optional 类中常用的方法有以下几个:
- ofNullable:如果值存在,返回 Optional 实例,否则返回一个空的 Optional 实例。
- orElse:如果有值则将其返回,否则返回一个默认值。
- ifPresent:如果值存在则使用该值调用 consumer,否则不执行任何操作。
- isPresent:如果值存在则方法会返回 true,否则返回 false。
- get:如果有值则将其返回,否则抛出 NoSuchElementException。
- orElseGet:与 orElse 类似,区别在于返回值类型不同。orElseGet 方法接受一个 Supplier 对象作为参数。如果有值则将其返回,否则返回 Supplier 接口实现的对象。
- orElseThrow:如果有值则将其返回,否则抛出 Supplier 接口创建的异常。
示例
假设有一个对象 Person
:
public class Person {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
}
现在我们可以使用 Optional 类来对 Person
对象进行判断并进行有效的处理:
Person person1 = new Person("张三", 18);
Person person2 = null;
Optional<Person> optional = Optional.ofNullable(person1);
// 如果 optional 中的值存在,则输出 "张三的年龄为:18",否则输出 "person2 不存在"
optional.ifPresent(p -> System.out.println(p.getName() + "的年龄为:" + p.getAge()));
optional = Optional.ofNullable(person2);
// 如果 optional 中的值存在,则输出 "null",否则输出 "person2 不存在"
System.out.println(optional.orElse(null));
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:JDK1.8新特性之方法引用 ::和Optional详解 - Python技术站