Java 8 中::(双冒号)运算符具有什么功能呢?
下文笔者讲述java8中双冒号运算符的功能简介说明,如下所示
例
双冒号运算符简介
双冒号运算操作符: 类方法的句柄 Lambda表达式的一种简写 我们将这种简写称之为"eta-conversion"或"η-conversion"
双冒号详解
英文格式双冒号::
读:double TestClass
双冒号(::)运算符
在Java 8中被用作方法引用(method reference)
它提供了一种执行方法的方法
方法引用需要由兼容的函数式接口组成的目标类型上下文。
双冒号的使用场景
| 类型 | 语法 | 示例 |
| 引用静态方法 | 类名::静态方法明 | Interg::parseInt |
| 引用特定对象实例方法 | 对象::实例方法名 | System.outprintln |
| 引用特定类型的任意对象的实例方法 | 特定类型::实例方法名 | StringcompareTolgnoreCase |
| 引用超类(父类)实例方法 | super:方法名 | |
| 引用类构造方法 | 类名::new | Arraylist:new |
| 引用数组构造方法 | 数组类型::new | String: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);
}
版权声明
本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。


