Java 8 中::(双冒号)运算符具有什么功能呢?

戚薇 Java教程 发布时间:2023-05-07 09:48:52 阅读数:9551 1
下文笔者讲述java8中双冒号运算符的功能简介说明,如下所示

双冒号运算符简介

双冒号运算操作符:
   类方法的句柄
   Lambda表达式的一种简写
   我们将这种简写称之为"eta-conversion"或"η-conversion"

双冒号详解

英文格式双冒号::
   读:double TestClass
   双冒号(::)运算符
      在Java 8中被用作方法引用(method reference)
       它提供了一种执行方法的方法
	     方法引用需要由兼容的函数式接口组成的目标类型上下文。

双冒号的使用场景

类型语法示例
引用静态方法类名::静态方法明Interg::parseInt
引用特定对象实例方法对象::实例方法名System.outprintln
引用特定类型的任意对象的实例方法特定类型::实例方法名StringcompareTolgnoreCase
引用超类(父类)实例方法super:方法名
引用类构造方法类名::newArraylist:new
引用数组构造方法数组类型::newString:new
import org.junit.Test;
import java.util.Arrays;
import java.util.List;

public class TestClass{ 

	public void test(){
	List<String> list = Arrays.asList("java265.com-1", "java265.com-2","java265.com-3");
	
	//静态方法引用ClassName : :methodName
	list.forEach(TestClass::print);
	   //下行代码和上述代码功能类似
	  //1ist.forEach((x)->TestClass.print(x));
	}
	//静态方法
   public static void print(String s){
	 system.out.print1n(s);
   }
}
例2:引用特定示例对象
import org.junit.Test;
import java.util.Arrays;
import java.util.List;

public class TestClass{ 

	public void test(){
	List<String> list = Arrays.asList("java265.com-1", "java265.com-2","java265.com-3");
	
	//静态方法引用ClassName : :methodName
	list.forEach(new TestClass()::print);
	   //下行代码和上述代码功能类似
	  //1ist.forEach((x)->new TestClass().print(x));
	}
	//静态方法
   public  void print(String s){
	 system.out.print1n(s);
   }
}
例3:引用特定类型的任意对象的实例方法
import org.junit.Test;
import java.util.Arrays;
public class TestClass{
public void test(){
	String[] arr = {"java我最爱","java265", "Java爱好者"};
    //引用String类型的任意对象的compareToIgnoreCase方法实现忽略大小写排序
	 Arrays.sort(arr, string: :compareTolgnoreCase);
    //上一行代码等同于
    //Arrays.sort(arr, (a,b)->a.compareToIgnoreCase(b));//输出
   for(string s:arr){
	System.out.print1n(s);
   }
  }
}
例4:引用超类(父类)实例方法
import org.junit.Test ;
import java.util.Arrays;
import java.util.List ;
public class TestClass extends BaseTestClass{
  public void test(){
	List<String> list = Arrays.asList("a", "b","c");
	  //实例方法引用instanceRef::methodName
	  list.forEach(super::print);
	}
	class BaseTestClass{ 
		//实例方法
		public void print(String s){
		   System.out.println(s);
		}
}
例5:引用类构造器,使用类名::new的方式实例化对象
 
public class TestClass{
	private String name;
	private int age;
	//无参构造
	public TestClass() {
	//有参构造
	public TestClass(String name, int age) {
		this.name = name;
		this.age =	age;
	}
public static void main(String[] args) {
	 //1.无参构造引用
	TestClassNoParam t = TestClass::new;
	TestClass c1 = t.createTestClass();
	System.out.println(c1);
	//有参构造引用
	TestClassWithParam t2 = TestClass::new; 
	TestClass c2 = t2.createTestClass("猫猫",18);
	System.out.println(c2);
}
	//生成toString方法打印查看
	@Override
	public String toString() {
	return "TestClass{ ”
	"name=
	name
	age=”
	age
	}
interface TestClassNoParam{
	//1.无参方法提供对象
	TestClass createTestClass();
}
interface TestClassWithParam{
    //有参方法提供对象( 数据类型要与TestClass有参构造函数对应)
    TestClass createTestClass(String s,int i);
}
例6:引用数组构造方法
使用jdk自带的java.util.function.Function类实现对数组构造函数的引用 
    或​​​​​​​
使用@FunctionalInterface自定义函数式接口来实现
public class TestClass{
public static void main(String[] args) {
MyArrayFunction<Integer , TestClass[]> function = TestClass[]::new;  
  //调用apply方法创建数组,6是数组的长度
  //将构造6个TestClass对象
   TestClass[ ] arr =function.apply(6);
  //循环输出-初始都为nul1 
  for (TestClass c:arr){
    System.out.println(c);
  }
}
//自定义函数式接口
@FunctionalInterface
interface MyArrayFunction<A,T>{
  T apply(A a);
}
版权声明

本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。

本文链接: https://www.Java265.com/JavaCourse/202305/6375.html

最近发表

热门文章

好文推荐

Java265.com

https://www.java265.com

站长统计|粤ICP备14097017号-3

Powered By Java265.com信息维护小组

使用手机扫描二维码

关注我们看更多资讯

java爱好者