一、定义
就是Java 8中的Lambda写法
双冒号(::)运算符在Java 8中被用作方法引用(method reference),方法引用是与lambda表达式相关的一个重要特性。它提供了一种不执行方法的方法。为此,方法引用需要由兼容的函数接口组成的目标类型上下文。
1、常用语法
- 静态方法引用(static method)语法:classname::methodname 例如:Person::getAge
- 对象的实例方法引用语法:instancename::methodname 例如:System.out::println
- 对象的超类方法引用语法: super::methodname
- 类构造器引用语法: classname::new 例如:ArrayList::new
- 数组构造器引用语法: typename[]::new 例如: String[]:new
二、介绍
1、静态方法语法
@SpringBootTest
class MyJavaTestApplicationTests {
@Test
public void test23() {
List<String> list = Arrays.asList("aaaa", "bbbb", "cccc");
//静态方法语法 ClassName::methodName
list.forEach(MyJavaTestApplicationTests::print);
}
public static void print(String content) {
System.out.println(content);
}
}
2、类实例方法语法
@SpringBootTest
class MyJavaTestApplicationTests {
@Test
public void test24() {
List<String> list = Arrays.asList("aaaa", "bbbb", "cccc");
//对象实例语法 instanceRef::methodName
list.forEach(new MyJavaTestApplicationTests()::print2);
}
public void print2(String content){
System.out.println(content);
}
}
3、超类方法语法
@SpringBootTest
class MyJavaTestApplicationTests extends BaseExample{
@Test
public void test25() {
List<String> list = Arrays.asList("aaaa", "bbbb", "cccc");
//对象的超类方法语法: super::methodName
list.forEach(super::print);
}
}
class BaseExample {
public void print(String content) {
System.out.println(content);
}
}
4、类构造器语法
@SpringBootTest
class MyJavaTestApplicationTests {
@Test
public void test26() {
InterfaceExample com = MyJavaTestApplicationTests::new;
MyJavaTestApplicationTests bean = com.create();
System.out.println(bean);
}
}
interface InterfaceExample{
MyJavaTestApplicationTests create();
}
如果是带参数的构造器,示例如下:
这里需要特别注意的是:Example 类并没有implements InterfaceExample接口
@SpringBootTest
class MyJavaTestApplicationTests {
@Test
public void test27() {
InterfaceExample com = ExTest::new;
ExTest bean = com.create("hello world");
System.out.println(bean.getName());
}
}
public class ExTest {
private String name;
public ExTest(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
public interface InterfaceExample {
ExTest create(String name);
}
5、类实例方法语法
import java.util.function.Function;
@SpringBootTest
class MyJavaTestApplicationTests {
@Test
public void test28() {
Function<Integer, ExTest[]> function = ExTest[]::new;
ExTest[] array = function.apply(4); //这里的4是数组的大小
for (ExTest e : array) {
System.out.println(e);
}
}
}
借用jdk自带的java.util.function.Function类实现的,如果想要自定义接口
@FunctionalInterface
public interface Interface<A, T>{
T apply(A a);
}
@SpringBootTest
class MyJavaTestApplicationTests {
@Test
public void test29() {
Interface <Integer, ExTest[]> function = ExTest[]::new;
ExTest[] array = function.apply(4); //这里的4是数组的大小
for (ExTest e : array) {
System.out.println(e);
}
}
}
三、案例
/**
* @author lichangyuan
* @create 2022-03-02 13:34
*/
public class MyUtil {
/**
* 对要遍历的元素添加add操作
*/
public void addString1(String x) {
System.out.println(x + "add");
}
/**
* 对要遍历的元素添加add操作
*/
public static void addString2(String x) {
System.out.println(x + "add");
}
/**
* 对要遍历的元素添加逻辑操作
*/
public void judgeInt(int i) {
if(i%2==0){
System.out.println(i+"是偶数");
}else{
System.out.println(i+"是奇数");
}
}
/**
* 对要遍历的元素添加逻辑操作
*/
public Integer fixInt(int i) {
if(i%2==0){
return i;
}else{
return i+1;
}
}
}
@SpringBootTest
class MyJavaTestApplicationTests {
@Test
void contextLoad21() {
List<String> stringList = Arrays.asList("a", "b", "c");
stringList.forEach(System.out::println);
System.out.println("=================================================");
stringList.forEach(new MyUtil()::addString1);
System.out.println("=================================================");
stringList.forEach(MyUtil::addString2);
System.out.println("=================================================");
List<Integer> integerList = Arrays.asList(1, 2, 3, 4, 5);
integerList.forEach(new MyUtil()::judgeInt);
System.out.println("=================================================");
}
}
- 坚持不懈,追求自己的梦想,即使路途崎岖,也要勇敢前行,终将收获成功的果实。
- 不要被过去的失败所困扰,用智慧和勇气开创美好的未来,每一次努力都是成长的脚印。
- 保持积极的心态,把握当下的每一个机会,勇敢地面对挑战,你将发现自己的无限可能。
- 拥有坚定的信念和不屈的意志,即使困难重重,也要坚持不懈,成功的曙光就在前方。
- 不要害怕失败,它是成功之母;不要畏惧困难,它是成长的阶梯。只有勇敢面对,才能走向辉煌。
- 努力不一定能成功,但放弃一定不会成功。坚持到底,你会发现,成功已经在不远的地方等待着你。
- 相信自己的能力,即使别人不看好你,也要坚定地走自己的路,成功的光芒会照耀你的前方。
- 在人生的道路上,不要停下脚步,不要停止探索,勇敢地向前,你会发现生活的美好和意义。
- 无论遇到什么困难,都要保持微笑和乐观,因为坚持和希望会给你带来无穷的力量和勇气。
- 生活会给你带来无数的挑战,但只要你不放弃,勇敢面对,你就一定会收获属于自己的辉煌。