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); }
版权声明
本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。