当前位置: 首页 > news >正文

java引用技术,Java 8 方法引用

Java 8 中新增加了 方法引用 这个概念。 但,什么是方法引用呢 ?

我们先来看一个例子,下面这个范例演示了如何遍历字符串列表并进行一些操作

LambdaTester.java

import java.util.Arrays;

import java.util.List;

import java.util.function.Function;

public class LambdaTester {

public static void main(String[] args)

{

LambdaTester tester = new LambdaTester();

tester.run();

}

public void run()

{

List list = Arrays.asList("Ram","Shyam","Kabir");

// 输出

for(String st: list){

System.out.println(st);

}

// 转换为大写

for(String st: list){

upperAndPrint(st);

}

}

public static void upperAndPrint(String s)

{

System.out.println(s.toUpperCase());

}

}

运行结果如下

[yufei@www.twle.cn helloworld]$ javac LambdaTester.java && java LambdaTester

Ram

Shyam

Kabir

RAM

SHYAM

KABIR

有简洁代码倾向的我们,看到那重复的 for(String st: list) 就会想如何能够直接把代码改的更简洁一些。

第一个想到的,肯定是使用 Java 8 新增的 lambda 表达式和 forEach 改造下

LambdaTester.java

import java.util.Arrays;

import java.util.List;

import java.util.function.Function;

public class LambdaTester {

public static void main(String[] args)

{

LambdaTester tester = new LambdaTester();

tester.run();

}

public void run()

{

List list = Arrays.asList("Ram","Shyam","Kabir");

// 输出

list.forEach(item -> System.out.println(item));

// 转换为大写

list.forEach(item -> upperAndPrint(item));

}

public static void upperAndPrint(String s)

{

System.out.println(s.toUpperCase());

}

}

哇,使用 Lambda 表达式真的是简洁了不少,但是,还能更简单一点吗?

比如 item -> System.out.println(item) 这个表达式,其实就是调用 System.out.println() 方法,并把 forEach 迭代列表生成的唯一参数 item 传给它而已

比如 item -> upperAndPrint(item) 这个表达式,也是一样啊,就是把 forEach 生成的唯一参数 item 传给给 upperAndPrint() 方法而已。

既然这样,我们为什么不能直接传递方法名给 forEach 呢?

对吧,所以我们改改,改成如下这种方式

import java.util.Arrays;

import java.util.List;

import java.util.function.Function;

public class LambdaTester {

public static void main(String[] args)

{

LambdaTester tester = new LambdaTester();

tester.run();

}

public void run()

{

List list = Arrays.asList("Ram","Shyam","Kabir");

// 输出

list.forEach(System.out.println);

// 转换为大写

list.forEach(upperAndPrint);

}

public static void upperAndPrint(String s)

{

System.out.println(s.toUpperCase());

}

}

运行结果如下

[yufei@www.twle.cn helloworld]$ javac LambdaTester.java && java LambdaTester

LambdaTester.java:18: 错误: 找不到符号

list.forEach(System.out.println);

^

符号: 变量 println

位置: 类型为PrintStream的变量 out

LambdaTester.java:21: 错误: 找不到符号

list.forEach(upperAndPrint);

^

符号: 变量 upperAndPrint

位置: 类 LambdaTester

2 个错误

这在所有的 Java 版本中都会报错,但是自 Java 8 开始,还真是可以直接传递方法名的,只是我们使用的方式不对而已。

加入我们改成下面这样,就会正确了

import java.util.Arrays;

import java.util.List;

import java.util.function.Function;

public class LambdaTester {

public static void main(String[] args)

{

LambdaTester tester = new LambdaTester();

tester.run();

}

public void run()

{

List list = Arrays.asList("Ram","Shyam","Kabir");

// 输出

list.forEach(System.out::println);

// 转换为大写

list.forEach(LambdaTester::upperAndPrint);

}

public static void upperAndPrint(String s)

{

System.out.println(s.toUpperCase());

}

}

运行结果如下

[yufei@www.twle.cn helloworld]$ javac LambdaTester.java && java LambdaTester

Ram

Shyam

Kabir

RAM

SHYAM

KABIR

哈哈哈,正确了。

在这个正确的方法中,有两个重点:

方法名和类名之间不是使用点号 ( . ) 而是使用两个冒号 :: 。

提供的方法名必须包含类名,如果没有引入该类名,则需要使用全限定类名,也就是需要添加包名作为前缀。

这种使用方法名做参数的做法,在 Java 8 中称之为 「 方法引用 」

Java 8 方法引用

方法引用 是 Java 8 新增加的功能。方法引用有点类似于 C / C++ 中的 函数指针 ,通过方法名称指向方法。

Java 8 中的方法引用通过 :: 符号引用方法,而且支持一下类型的方法引用

静态方法

实例方法

使用 new 运算符的构造函数。例如 TreeSet::new

范例

我们重写一下上面的范例,演示下如何引用静态方法和实例方法

import java.util.Arrays;

import java.util.List;

import java.util.function.Function;

public class LambdaTester {

public static void main(String[] args)

{

LambdaTester tester = new LambdaTester();

tester.run();

}

public void run()

{

List list = Arrays.asList("Ram","Shyam","Kabir");

// 输出

list.forEach(System.out::println);

// 转换为大写

list.forEach(LambdaTester::upperAndPrint);

// 转换为小写并输出

list.forEach(this::lowerAndPrint);

}

public void lowerAndPrint(String s)

{

System.out.println(s.toLowerCase());

}

public static void upperAndPrint(String s)

{

System.out.println(s.toUpperCase());

}

}

运行结果如下

[yufei@www.twle.cn helloworld]$ javac LambdaTester.java && java LambdaTester

Ram

Shyam

Kabir

RAM

SHYAM

KABIR

ram

shyam

kabir

相关文章:

  • MATLAB简单绘图命令,简单的matlab绘图命令
  • matlab模糊控制移值到c,C/C++实现模糊控制,借助MATLAB辅助设计和fis.c文件 | 学步园...
  • matlab 稳定系统,matlab分析系统的稳定性
  • PHP的continue语句,PHP中continue语句的应用
  • php判断区间数字,如何快速判断数字在那个区间?
  • 有限差分matlab工具箱,FDTD(时域有限差分法)算法的Matlab源程序
  • matlab实现主机通信,设置主机模型和目标模型之间的通信
  • php电脑网站,PHP网站在线人数的程序代码 -电脑资料
  • 电脑php的基本方法是什么,做文员的基本电脑操作是什么
  • php 抽象类和抽象方法,PHP中抽象类和抽象方法概念与用法实例分析
  • PHP二维数组中文排序,PHP 对二维数组排序
  • php中XML怎么创建,PHP创建XML文档
  • oracle 批量insert 锁,oracle nologging 和批量insert
  • oracle 外链接 加条件,Oracle外连接中对非连接条件使用(+)需要注意的地方
  • oracle通过trc查找死锁sql,从trc查找死锁的有关问题
  • [分享]iOS开发-关于在xcode中引用文件夹右边出现问号的解决办法
  • Android开发 - 掌握ConstraintLayout(四)创建基本约束
  • css选择器
  • export和import的用法总结
  • Golang-长连接-状态推送
  • Java|序列化异常StreamCorruptedException的解决方法
  • JDK 6和JDK 7中的substring()方法
  • js算法-归并排序(merge_sort)
  • MySQL数据库运维之数据恢复
  • node 版本过低
  • Terraform入门 - 1. 安装Terraform
  • vue学习系列(二)vue-cli
  • 测试开发系类之接口自动化测试
  • 关于Android中设置闹钟的相对比较完善的解决方案
  • 关于字符编码你应该知道的事情
  • 紧急通知:《观止-微软》请在经管柜购买!
  • 如何解决微信端直接跳WAP端
  • 如何优雅地使用 Sublime Text
  • 使用 Xcode 的 Target 区分开发和生产环境
  • 小程序开发中的那些坑
  • 东超科技获得千万级Pre-A轮融资,投资方为中科创星 ...
  • #162 (Div. 2)
  • #pragma multi_compile #pragma shader_feature
  • #Z0458. 树的中心2
  • #常见电池型号介绍 常见电池尺寸是多少【详解】
  • (0)Nginx 功能特性
  • (C++)栈的链式存储结构(出栈、入栈、判空、遍历、销毁)(数据结构与算法)
  • (DenseNet)Densely Connected Convolutional Networks--Gao Huang
  • (java版)排序算法----【冒泡,选择,插入,希尔,快速排序,归并排序,基数排序】超详细~~
  • (附源码)spring boot火车票售卖系统 毕业设计 211004
  • (附源码)springboot美食分享系统 毕业设计 612231
  • (附源码)计算机毕业设计SSM智慧停车系统
  • (考研湖科大教书匠计算机网络)第一章概述-第五节1:计算机网络体系结构之分层思想和举例
  • (一)eclipse Dynamic web project 工程目录以及文件路径问题
  • (转)JAVA中的堆栈
  • .babyk勒索病毒解析:恶意更新如何威胁您的数据安全
  • .net refrector
  • .NET 使用 XPath 来读写 XML 文件
  • .NET/C# 使用 ConditionalWeakTable 附加字段(CLR 版本的附加属性,也可用用来当作弱引用字典 WeakDictionary)
  • .one4-V-XXXXXXXX勒索病毒数据怎么处理|数据解密恢复