一:简介

方法引用分为三种,方法引用通过一对双冒号:: 来表示,方法引用是一种函数式接口的另一种书写方式

  • 静态方法引用,通过类名::静态方法名, 如 Integer::parseInt

  • 实例方法引用,通过实例对象::实例方法,如 str::substring

  • 构造方法引用,通过类名::new, 如 User::new

二:方法引用

public final class Integer {public static int parseInt(String s) throws NumberFormatException {return parseInt(s,10);}
}

通过方法引用,可以将方法的引用赋值给一个变量,通过赋值给Function,说明方法引用也是一种函数式接口的书写方式,Lambda表达式也是一种函数式接口,Lambda表达式一般用于自己提供方法体,而方法引用一般直接引用现成的方法。

public class User {private String username;private Integer age;public User() {}public User(String username, Integer age) {this.username = username;this.age = age;}@Overridepublic String toString() {return "User{" +"username='" + username + '\'' +", age=" + age +'}';}// Getter&Setter
}
public static void main(String[] args) {// 使用双冒号::来构造静态函数引用Function<String, Integer> fun = Integer::parseInt;Integer value = fun.apply("123");System.out.println(value);// 使用双冒号::来构造非静态函数引用String content = "Hello JDK8";Function<Integer, String> func = content::substring;String result = func.apply(1);System.out.println(result);// 构造函数引用BiFunction<String, Integer, User> biFunction = User::new;User user = biFunction.apply("mengday", 28);System.out.println(user.toString());// 函数引用也是一种函数式接口,所以也可以将函数引用作为方法的参数sayHello(String::toUpperCase, "hello");
}// 方法有两个参数,一个是
private static void sayHello(Function<String, String> func, String parameter){String result = func.apply(parameter);System.out.println(result);
}

三:Optional 可选值

在Google Guava 中就有Optional,在Swift语言中也有这样类似的语法,在Swift中将可选值作为一种数据类型,地位和基本类型平齐平做,地位非常高。

package java.util;import java.util.function.Consumer;
import java.util.function.Function;
import java.util.function.Predicate;
import java.util.function.Supplier;/*** @since 1.8*/
public final class Optional<T> {private static final Optional<?> EMPTY = new Optional<>();private final T value;private Optional() {this.value = null;}// 返回一个空的 Optional实例public static<T> Optional<T> empty() {@SuppressWarnings("unchecked")Optional<T> t = (Optional<T>) EMPTY;return t;}private Optional(T value) {this.value = Objects.requireNonNull(value);}// 返回具有 Optional的当前非空值的Optionalpublic static <T> Optional<T> of(T value) {return new Optional<>(value);}// 返回一个 Optional指定值的Optional,如果非空,则返回一个空的 Optionalpublic static <T> Optional<T> ofNullable(T value) {return value == null ? empty() : of(value);}// 如果Optional中有一个值,返回值,否则抛出 NoSuchElementException 。public T get() {if (value == null) {throw new NoSuchElementException("No value present");}return value;}// 返回true如果存在值,否则为 false public boolean isPresent() {return value != null;}// 如果存在值,则使用该值调用指定的消费者,否则不执行任何操作。public void ifPresent(Consumer<? super T> consumer) {if (value != null)consumer.accept(value);}// 如果一个值存在,并且该值给定的谓词相匹配时,返回一个 Optional描述的值,否则返回一个空的 Optionalpublic Optional<T> filter(Predicate<? super T> predicate) {Objects.requireNonNull(predicate);if (!isPresent())return this;elsereturn predicate.test(value) ? this : empty();}// 如果存在一个值,则应用提供的映射函数,如果结果不为空,则返回一个 Optional结果的 Optional 。public<U> Optional<U> map(Function<? super T, ? extends U> mapper) {Objects.requireNonNull(mapper);if (!isPresent())return empty();else {return Optional.ofNullable(mapper.apply(value));}}// 如果一个值存在,应用提供的 Optional映射函数给它,返回该结果,否则返回一个空的 Optional 。public<U> Optional<U> flatMap(Function<? super T, Optional<U>> mapper) {Objects.requireNonNull(mapper);if (!isPresent())return empty();else {return Objects.requireNonNull(mapper.apply(value));}}// 如果值存在,就返回值,不存在就返回指定的其他值public T orElse(T other) {return value != null ? value : other;}public T orElseGet(Supplier<? extends T> other) {return value != null ? value : other.get();}public <X extends Throwable> T orElseThrow(Supplier<? extends X> exceptionSupplier) throws X {if (value != null) {return value;} else {throw exceptionSupplier.get();}}
}

关于of方法,现在好像很流行,就是提供一个static方法,方法名称叫of,方法的返回值返回当前类,并且把构造函数设置为私有private,用静态of方法来代替构造函数。

public class User {private String username;private Integer age;private User() {}public static User of() {return new User();}private User(String username, Integer age) {this.username = username;this.age = age;}public static User of(String username, Integer age) {return new User(username, age);}
}

Main

public static void main(String[] args) {// Optional类已经成为Java 8类库的一部分,在Guava中早就有了,可能Oracle是直接拿来使用了// Optional用来解决空指针异常,使代码更加严谨,防止因为空指针NullPointerException对代码造成影响String msg = "hello";Optional<String> optional = Optional.of(msg);// 判断是否有值,不为空boolean present = optional.isPresent();// 如果有值,则返回值,如果等于空则抛异常String value = optional.get();// 如果为空,返回else指定的值String hi = optional.orElse("hi");// 如果值不为空,就执行Lambda表达式optional.ifPresent(opt -> System.out.println(opt));
}

作者:泡代码的小二黑

来源:https://urlify.cn/Qjaaue

关注微信公众号:互联网架构师,在后台回复:2T,可以获取我整理的教程,都是干货。

猜你喜欢

1、GitHub 标星 3.2w!史上最全技术人员面试手册!FackBoo发起和总结

2、如何才能成为优秀的架构师?

3、从零开始搭建创业公司后台技术栈

4、程序员一般可以从什么平台接私活?

5、37岁程序员被裁,120天没找到工作,无奈去小公司,结果懵了...

6、滴滴业务中台构建实践,首次曝光

7、不认命,从10年流水线工人,到谷歌上班的程序媛,一位湖南妹子的励志故事

8、15张图看懂瞎忙和高效的区别

9、2T架构师学习资料干货分享

卧槽!你竟然不晓得Java中可以用 :: 吗?相关推荐

  1. 我说我精通字符串,面试官竟然问我Java中的String有没有长度限制!?

    String是Java中很重要的一个数据类型,除了基本数据类型以外,String是被使用的最广泛的了,但是,关于String,其实还是有很多东西容易被忽略的. 就如本文我们要讨论的问题:Java中的S ...

  2. 我说我精通字符串,面试官竟然问我Java中的String有没有长度限制!?|附视频讲解

    关于String有没有长度限制的问题,我之前单独写过一篇文章分析过,最近我又抽空回顾了一下这个问题,发现又有了一些新的认识.于是准备重新整理下这个内容. 这次在之前那篇文章的基础上除了增加了一些验证过 ...

  3. 这是什么操作?java中的变量竟然可以先使用后声明?

    相信大家在看到标题之后,是疑惑的点进来看内容的. 在看到标题之后,大家肯定会怀疑,我赵某人用java写了好几年的代码了,还真就没见过java中的变量能先用在声明,今天就是进来看看你在没有声明变量的前提 ...

  4. Java中的枚举,竟然有这么多不为人知的知识点

    Java枚举,也称作Java枚举类型,是一种字段由一组固定常量集合组成的类型.枚举的主要目的是加强编译时类型的安全性.enum关键字是Java中的保留关键字. 在编译或设计时,当我们知道所有变量的可能 ...

  5. Java中的锁原理、锁优化、CAS、AQS详解

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 作者:景小财 www.jianshu.com/p/e674ee68 ...

  6. Java 中关于 try、catch、finally 中的细节分析

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试资料 作者:God Is Coder https://www.cnblo ...

  7. Java中的BigDecimal类你真的了解吗?

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试资料 作者:HikariCP www.jianshu.com/p/c81 ...

  8. Java中四则运算的那些坑

    为什么80%的码农都做不了架构师?>>>    使用Java开发多年,感觉自己的水平也在不断提升,但是被Java狂虐却从来都没变过,而且任何一个Java的小角落,都能把我虐的体无完肤 ...

  9. double java 坑,Java中四则运算的那些坑

    使用Java开发多年,感觉自己的水平也在不断提升,但是被Java狂虐却从来都没变过,而且任何一个Java的小角落,都能把我虐的体无完肤,但是无奈要靠Java吃饭,还得恬着脸继续使用下去. 说说最近遇到 ...

  10. java中的浮点计算

    记得很久以前编写测试用例,无意间发现 double c=2.31; double d=0.1; System.out.println(c/d); 最后输出的竟然是23.099999999999998, ...

最新文章

  1. 线性回归模型原理及推导
  2. 解决SQL Server里sp_helptext输出格式错行问题
  3. k8s中几种port介绍
  4. 【EventBus】EventBus 使用示例 ( 最简单的 EventBus 示例 )
  5. mysql如何定义消耗资源多的sql语句_如何查找消耗资源较大的SQL
  6. oracle使用sqlplus工具命令连接,快速启动oracle服务。
  7. 使用保险丝结构管理MQ和ESB的大型部署,第I部分
  8. POJ - 2828
  9. maven+scala和java_maven打包scala+java工程
  10. 我的世界服务器起床地图维修,Minecraft·起床战争地图更新来了!地图“雪仗”全面解读!...
  11. iPhone四个步骤高效安装WAPI证书
  12. 思考犹太家庭如何教育出这么多精英及富豪
  13. 阿里云云数据库RDS快速使用教程
  14. ios自己搭建服务器证书,iOS一步一步实现Https自建证书校验
  15. 自然语言处理--基于 AIML 的模式匹配聊天机器人
  16. 人工智能个性化和逼真的漫画素描生成输入人脸图像创建漫画照片
  17. java 日历工具_Java开发笔记(四十二)日历工具的常见应用
  18. 存储故障时的ORA-7445错误
  19. 新泽西州BPU批准PSE&G33MW扩展光伏项目
  20. react笔记-基础

热门文章

  1. MongoDB简单使用 —— 安装
  2. OpenStack 安装教程(使用Fuel )
  3. 算法基础(八):超具体最优二叉树构建(1)
  4. 【linux】——FTP出现500 OOPS: cannot change directory的解决方法
  5. GetPrivateProfileString的问题,获得的CString结构有问题,高手指点
  6. C# winform如何设置ListBox背景图或者透明背景及边框色
  7. winform最小化后隐藏到右下角,单击或双击后恢复
  8. Motion 5 for Mac(视频后期特效处理软件)
  9. 玛雅Maya 2022 for Mac(三维动画制作软件)
  10. Snagit 2021 for mac(强大的屏幕截图工具)