《Java 1.8》方法引用与Optional 类
一、方法引用分类
通过方法引用,可以将方法的引用赋值给一个变量,通过赋值给Function,说明方法引用也是一种函数式接口的书写方式,Lambda表达式也是一种函数式接口,Lambda表达式一般用于自己提供方法体,而方法引用一般直接引用现成的方法。
1、构造器引用:它的语法是Class::new,或者更一般的Class< T >::new
2、静态方法引用:它的语法是Class::static_method
3、特定类的任意对象的方法引用:它的语法是Class::method
4、特定对象的方法引用:它的语法是instance::method
二、方法引用优缺点
优点:方法引用使得语言的构造更加简洁,减少冗余代码。
缺点:代码易读性差,不方便调试
三、示例
package com.learn.demo; import java.util.ArrayList; import java.util.List; @FunctionalInterface interface MethodInterface<T>{ T get(); } class MethodModel { private String name; private String word; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getWord() { return word; } public void setWord(String word) { this.word = word; } @Override public boolean equals(Object obj) { MethodModel method = (MethodModel)obj; return this.getName().equals(method.getName()) && this.getWord().equals(method.getWord()); } @Override public String toString() { return "MethodDemo [name=" + name + ", word=" + word + "]"; } public static MethodModel create(final MethodInterface<MethodModel> method){ MethodModel methodDemo = method.get(); methodDemo.setName("name 3"); methodDemo.setWord("word 3"); return methodDemo; } public static void collide(final MethodModel method){ System.out.println("Collided "+method.toString()); } public void follow(final MethodModel method){ if(method.equals(this)){ System.out.println("Following the "+method.toString()); } } public void repair(){ System.out.println("Repaired "+this.toString()); } } public class MethodDemo{ public static void main(String[] args) { //构造器引用(创建实例) final MethodModel method = MethodModel.create(MethodModel :: new); System.out.println(method.toString()); //静态方法引用(遍历实例) List<MethodModel> list = new ArrayList<MethodModel>(); for (int i = 0; i < 10; i++) { MethodModel demo = new MethodModel(); demo.setName("name "+i); demo.setWord("word "+i); list.add(demo); } list.forEach(MethodModel :: collide); //特定对象的方法引用(筛选实例) final MethodModel police = MethodModel.create(MethodModel :: new); list.forEach(police :: follow); //实例方法引用(选出自己) list.forEach(MethodModel::repair); } }
四、Optional类
序号 | 方法 | 描述 |
1 | static <T> Optional<T> empty() | 返回空的 Optional 实例。 |
2 | <U> Optional<U> flatMap(Function<? super T,Optional<U>> mapper) | 如果值存在,返回基于Optional包含的映射方法的值,否则返回一个空的Optional |
3 | Optional<T> filter(Predicate<? super <T> predicate) | 如果值存在,并且这个值匹配给定的 predicate,返回一个Optional用以描述这个值,否则返回一个空的Optional。 |
4 | T get() | 如果在这个Optional中包含这个值,返回值,否则抛出异常:NoSuchElementException |
5 | void ifPresent(Consumer<? super T> consumer) | 如果值存在则使用该值调用 consumer , 否则不做任何事情。 |
6 | boolean isPresent() | 如果值存在则方法会返回true,否则返回 false。 |
7 | <U>Optional<U> map(Function<? super T,? extends U> mapper) | 如果存在该值,提供的映射方法,如果返回非null,返回一个Optional描述结果。 |
8 | static <T> Optional<T> of(T value) | 返回一个指定非null值的Optional。 |
9 | static <T> Optional<T> ofNullable(T value) | 如果为非空,返回 Optional 描述的指定值,否则返回空的 Optional。 |
10 | T orElse(T other) | 如果存在该值,返回值, 否则返回 other。 |
11 | T orElseGet(Supplier<? extends T> other) | 如果存在该值,返回值, 否则触发 other,并返回 other 调用的结果。 |
12 | <X extends Throwable> T orElseThrow(Supplier<? extends X> exceptionSupplier) | 如果存在该值,返回包含的值,否则抛出由 Supplier 继承的异常 |
示例:
package com.learn.demo; import java.util.Optional; public class OptionalDemo { public static void main(String[] args) { // of(); // ofNullable(); // empty(); // get(); // orElse(); // orElseGet(); // orElseThrow(); // filter(); // map(); // ifPresent(); // flagMap(); // isPresent(); } /** * 不能为null,否则会报NullPointerException错误 */ public static void of(){ //创建Optional示例,并赋值 Optional<String> optional1 = Optional.of("of demo"); //如果我们用of方法创建Optional对象时,所传入的值为null,则抛出NullPointerException Optional<String> optional2 = Optional.of(null); } /** * of的补充,增加了判空条件 */ public static void ofNullable(){ //为指定的值创建Optional对象,不管所传入的值为null不为null,创建的时候都不会报错 Optional<String> optional3 = Optional.ofNullable(null); Optional<String> optional4 = Optional.ofNullable("of demo"); } /** * 创建一个空的Optional对象 */ public static void empty(){ //创建一个空的String类型的Optional对象 Optional<String> optional5 = Optional.empty(); } /** * 如果我们创建的Optional对象中有值存在则返回此值,如果没有值存在,则会抛出 NoSuchElementException异常 */ public static void get(){ Optional<String> optional5 = Optional.ofNullable("get demo"); System.out.println(optional5.get()); Optional<String> optional6 = Optional.ofNullable(null); System.out.println(optional6.get()); } /** * 如果创建的Optional中有值存在,则返回此值,否则返回一个默认值 */ public static void orElse(){ Optional<String> optional7 = Optional.of("of else demo"); System.out.println(optional7.orElse("demo")); Optional<String> optional8 = Optional.empty(); System.out.println(optional8.orElse("demo")); } /** * 如果创建的Optional中有值存在,则返回此值,否则返回一个由Supplier接口生成的值 */ public static void orElseGet(){ Optional<String> optional9 = Optional.of("or else get demo"); System.out.println(optional9.orElseGet(() -> "demo")); Optional<String> optional10 = Optional.empty(); System.out.println(optional10.orElseGet(() -> "demo")); } /** * 如果创建的Optional中有值存在,则返回此值,否则抛出一个由指定的Supplier接口生成的异常 */ public static void orElseThrow(){ try { Optional<String> optional11 = Optional.of("else throw demo"); System.out.println(optional11.orElseThrow(ElseDefaultException::new)); Optional<String> optional12 = Optional.empty(); System.out.println(optional12.orElseThrow(ElseDefaultException::new)); } catch (Exception e) { e.printStackTrace(); } } /** * 如果创建的Optional中的值满足filter中的条件,则返回包含该值的Optional对象,否则返回一个空的Optional对象 * * 注意Optional中的filter方法和Stream中的filter方法是有点不一样的,Stream中的filter方法是对一堆元素进 * 行过滤,而Optional中的filter方法只是对一个元素进行过滤,可以把Optional看成是最多只包含一个元素 的Stream。 */ public static void filter(){ Optional<String> optional = Optional.of("filter demo"); System.out.println(optional.filter(e -> e.length() > 5).orElse("demo")); optional = Optional.empty(); System.out.println(optional.filter(e -> e.length() > 5).orElse("demo")); } /** * 如果创建的Optional中的值存在,对该值执行提供的Function函数调用 */ public static void map(){ //map方法执行传入的lambda表达式参数对Optional实例的值进行修改,修改后的返回值仍然是一个Optional对象 Optional<String> optional = Optional.of("map demo"); System.out.println(optional.map(e -> e.toUpperCase()).orElse("error")); optional = Optional.empty(); System.out.println(optional.map(e -> e.toUpperCase()).orElse("success")); } /** * ifPresent方法的参数是一个Consumer的实现类,Consumer类包含一个抽象方法,该抽象方法对传入的值进行处理,只处理没有返回值。 */ public static void ifPresent(){ Optional<String> optional = Optional.of("if present"); optional.ifPresent(e-> System.out.println("我被处理了。。。"+e)); } /** * 1、创建的Optional中的值存在,执行提供的Function函数调用,返回一个Optional类型的值 * 2、创建的Optional中的值不存在,返回一个空的Optional对象. * flatMap与map(Funtion)方法类似,区别在于flatMap中的mapper返回 * 值必须是Optional,map方法的mapping函数返回值可以是任何类型T。调用结束时,flatMap不会对结果 * 用Optional封装。 */ public static void flagMap(){ //map方法中的lambda表达式返回值可以是任意类型,在map函数返回之前会包装为Optional。 //但flatMap方法中的lambda表达式返回值必须是Optionl实例 Optional<String> optional = Optional.of("flag map demo"); System.out.println(optional.flatMap(e -> Optional.of("flag default")).orElse("error")); optional = Optional.empty(); System.out.println(optional.flatMap(e -> Optional.empty()).orElse("error")); } /** * 如果值存在则方法会返回true,否则返回 false。 */ public static void isPresent(){ Optional<String> optional = Optional.of("present demo"); System.out.println(optional.isPresent()); } static class ElseDefaultException extends Exception{ private static final long serialVersionUID = 1609463882582374229L; public ElseDefaultException(){ super("自定义异常"); } public ElseDefaultException(String message){ super(message); } } }
友情链接:
https://blog.csdn.net/zknxx/article/details/78586799