Java双冒号(::)运算符使用详解
目录
- 1.说明
- 2.先来说下@FunctionalInterface
- 3. 下面来讲讲这个 "::"是干嘛的
- 4. 建立一个Person类
- 4:构建多个person对象,放入数组中,然后对数组中的person重新排序
- 5:揭秘 "::"符号
- 6.0 方法引用的支持如下
1.说明
之前没用过::这个东西,今天看flink的时候发现官网有个例子用到了这个符号, 本着求知欲去百度查了一番,没找到能说到我心里去的解释,本着求知欲的态度,我去了官网看了看. java ::
2.先来说下@FunctionalInterface
java8 lambda 内部接口需要@FunctionalInterface这个注解,这个注解是一个说明性质的注解,被@FunctionalInterface注解的接口只能由一个抽象方法,@FunctionalInterface只能用于注解接口而不能用在class以及枚举上.
被@FunctionalInterface注解的符合规则的接口,可以用lambda表达式. 下面举一个例子:
public class Main {public static void pr(String s){System.out.println(s); }public static void main(String[] args) throws Exception {List list = Arrays.asList("aaaa", "bbbb", "cccc"); list.forEach(s -> System.out.println(s)); }}
所以说,@FunctionalInterface用于lambda样式说明.
3. 下面来讲讲这个 "::"是干嘛的
"::"官网对这个符号的解释是方法引用,也就是引用一个方法的意思,英文名称Method References
lambda expressions 可以用来创建一匿名的方法, 这个匿名的方式你需要自己实现.
1. list.forEach(new Consumer() {@Overridepublic void accept(String s) {System.out.println(s); }}); 2. list.forEach(s -> System.out.println(s));
上面两种写法是一样的,下面就是lambda表达式.
上面说了lambda表达式你需要自己实现,但是有些时候这不是必要的,比如你的项目里某个地方存在了一个符合当前逻辑的lambda表达式的方法, 那么我是否可以直接拿来用?, 答案是可以, 程序追求的就是不重复极简的思想, 既有则拿来用即可,为什么还要自己实现呢. Method References 就是用来做这件事的.
【Java双冒号(::)运算符使用详解】在看下面的例子之前读者需要知道java 比较器,否则看不懂代码.
4. 建立一个Person类
public class Person implements Comparable{public String name; public int age; @Overridepublic String toString() {return "Person{" +"name='" + name + '\'' +", age=" + age +'}'; }public Person(String name, int age) {this.name = name; this.age = age; }public static int compareByAge(Person a, Person b) {return a.compareTo(b); }@Overridepublic int compareTo(Person o) {if (this.age > o.age){return -1; }else{return 1; }}}
4:构建多个person对象,放入数组中,然后对数组中的person重新排序
public class Test {//编写Comparator,Person的ageprivate static final Comparator COMPARATOR = new Comparator() {public int compare(Person a, Person b) {return a.compareTo(b); //运用User类的compareTo方法比较两个对象}}; public static void main(String[] args) {Person one = new Person("张三",50); Person two = new Person("李四",100); ArrayList array = new ArrayList<>(); array.add(one); array.add(two); Collections.sort(array,COMPARATOR); System.out.println(array); }}//输出结果://[Person{name='李四', age=100}//Person{name='张三', age=50}]
仔细看上面的代码,重点在Collections.sort(array,COMPARATOR); 这一行,sort接收两个参数,第一个是要被排序的数组,第二个是一个比较器对象Comparator,其源码如下,我只粘贴了必要的部分.
**@FunctionalInterface**public interface Comparator{int compare(T o1, T o2); }
@FunctionalInterface我们知道,被这个注解修饰的接口可以用lambda表达式的.
所以我们将class Test改成下面的样子:
public class Test {public static void main(String[] args) {Person one = new Person("张三",50); Person two = new Person("李四",100); ArrayList array = new ArrayList<>(); array.add(one); array.add(two); Collections.sort(array, (a, b) -> a.compareTo(b)); System.out.println(array); }}
注意:下面是lambda写法,和正常传统写法
Collections.sort(array, (a, b) -> a.compareTo(b)); 和下面的等效Collections.sort(array, new Comparator() {@Overridepublic int compare(Person a, Person b) {return a.compareTo(b); }});
5:揭秘 "::"符号
到这里其实我们上面的功能已经完成了,我们来分析一下代码.
1:构造了两个对象
2:把对象放入了数组
3:Collection.sort(array,Comparator
关键点在于:Comparator
因此,Collection.sort(array,Comparator
Collections.sort(array, (a, b) -> a.compareTo(b));
- **(a, b) -> a.compareTo(b)**这个其实就是匿名函数, 该函数的参数分别是Person a, Person b
- a.compareTo(b) 是该匿名函数的逻辑,
public class Test {public static void main(String[] args) {Person one = new Person("张三",50); Person two = new Person("李四",100); ArrayList array = new ArrayList<>(); array.add(one); array.add(two); Collections.sort(array, Person::compareByAge); //写法一// Collections.sort(array, one::entyMethod); //写法二System.out.println(array); }}
附官网的一句话:
Because this lambda expression
invokes an existing method,
you can use a method reference
**instead of** a lambda expression
Collections.sort(array, Person::compareByAge); Collections.sort(array, one::entyMethod);
这两种写法都是可行的.
6.0 方法引用的支持如下
文章图片
我们上面讲了静态方法,和类方法的代替方式,至于其他的这里不讲了,主要是我要去吃饭了.
到此这篇关于Java双冒号(::)运算符使用详解的文章就介绍到这了,更多相关Java双冒号(::)内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
推荐阅读
- JAVA(抽象类与接口的区别&重载与重写&内存泄漏)
- 事件代理
- 爱琐搭配(喜欢复古、冷淡,像这种双环设计的气质耳环)
- Java|Java OpenCV图像处理之SIFT角点检测详解
- java中如何实现重建二叉树
- 数组常用方法一
- 【Hadoop踩雷】Mac下安装Hadoop3以及Java版本问题
- 唐嫣可真会穿,西装搭牛仔裤都能穿出高级感,一双大长腿太抢镜
- Java|Java基础——数组
- RxJava|RxJava 在Android项目中的使用(一)