iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >Java双冒号(::)运算符使用详解
  • 523
分享到

Java双冒号(::)运算符使用详解

2024-04-02 19:04:59 523人浏览 八月长安

Python 官方文档:入门教程 => 点击学习

摘要

目录1.说明2.先来说下@FunctionalInterface3. 下面来讲讲这个 "::"是干嘛的4. 建立一个Person类4:构建多个person对象,放入数组中,然后对数组

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<String> 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<String>() {
            @Override
            public void accept(String s) {
                System.out.println(s);
            }
        });
   2. list.forEach(s -> System.out.println(s));

上面两种写法是一样的,下面就是lambda表达式.

上面说了lambda表达式你需要自己实现,但是有些时候这不是必要的,比如你的项目里某个地方存在了一个符合当前逻辑的lambda表达式的方法, 那么我是否可以直接拿来用?, 答案是可以, 程序追求的就是不重复极简的思想, 既有则拿来用即可,为什么还要自己实现呢. Method References 就是用来做这件事的.

在看下面的例子之前读者需要知道java 比较器,否则看不懂代码.

4. 建立一个Person类


public class Person implements Comparable<Person>{
    public String name;
    public int age;

    @Override
    public 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);
    }

    @Override
    public int compareTo(Person o) {
        if (this.age > o.age){
            return -1;
        }else{
            return 1;
        }
    }
}

4:构建多个person对象,放入数组中,然后对数组中的person重新排序


public class Test {

    //编写Comparator,Person的age
    private static final Comparator<Person> COMPARATOR = new Comparator<Person>() {
        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<Person> 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<T> {
    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<Person> 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() {
@Override
public int compare(Person a, Person b) {
return a.compareTo(b);
}
});

5:揭秘 "::"符号

到这里其实我们上面的功能已经完成了,我们来分析一下代码.
1:构造了两个对象
2:把对象放入了数组
3:Collection.sort(array,Comparator<T>) 对数组进行排序

关键点在于:Comparator<T> 比较器,它是一个被@FunctionalInterface修饰的接口,我们一般成为函数式接口.
因此,Collection.sort(array,Comparator<T>) ,对于第二个参数Comparator<T>,我们可以传入一个匿名实现类,然后实现里面的 int compare(T o1, T o2) 方法,也可以写成lambda表达式的样子,到这里如果你都懂了,那么接下来就好说了,如果没明白,回头接着看,相信自己骚年. 下面我们重点看lambda方式的写法,这和"::"息息相关

Collections.sort(array, (a, b) -> a.compareTo(b));

  1. **(a, b) -> a.compareTo(b)**这个其实就是匿名函数, 该函数的参数分别是Person a, Person b
  2. a.compareTo(b) 是该匿名函数的逻辑,

也即是说我们写出来的这个匿名函数有两个参数,以及一个调用compareTo的函数体,到这里其实结束了,一开始我们就说了,符号"::"的意义就是用一个已经存在的函数代替我们lambda表达式中的函数体,只要这个存在的函数和lambda函数体的函数格式一致就行了. 格式其实就是参数个数,和参数类型下面是新的class Test揭示了答案


public class Test {
    public static void main(String[] args) {
        Person one = new Person("张三",50);
        Person two = new Person("李四",100);
        ArrayList<Person> 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双冒号(::)内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: Java双冒号(::)运算符使用详解

本文链接: https://www.lsjlt.com/news/135881.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Java双冒号(::)运算符使用详解
    目录1.说明2.先来说下@FunctionalInterface3. 下面来讲讲这个 "::"是干嘛的4. 建立一个Person类4:构建多个person对象,放入数组中,然后对数组...
    99+
    2024-04-02
  • C++ 双冒号::符号详解
    目录一、作用域符号:二、全局作用域符号:三、作用域分解运算符:一、作用域符号: 作用域符号 :: 的前面一般是类名称,后面一般是该类的成员名称,C++ 为例避免不同的类有名称相同的成...
    99+
    2023-03-09
    C++ 双冒号
  • kotlin中,::双冒号的使用详解
    一、:: 双冒号操作符 在 Kotlin 中 , :: 双冒号操作符 的作用是 获取 类 , 对象 , 函数 , 属性 的 类型对象 引用 ; 获取的这些引用 , 并不常用 , 都是在 Kotlin ...
    99+
    2023-10-02
    kotlin android java
  • 详解kotlin中::双冒号的使用
    目录一、:: 双冒号操作符1、获取类的引用2、获取对象类型的引用3、获取函数的引用4、获取属性的引用二、 java.lang.Class 与 kotlin.reflect.KClas...
    99+
    2023-05-16
    kotlin::双冒号 kotlin::双冒号使用 kotlin双冒号
  • C++中双冒号::用法案例详解
    C++中的双冒号 :: 第一种,类作用域,用来标明类的变量、函数 Human::setName(char* name); 第二种,命名空间作用域,用来注明...
    99+
    2024-04-02
  • Java中双冒号: :的作用
    一、定义 双冒号运算操作符是类方法的句柄,lambda表达式的一种简写 表达式:person -> person.getName();可以替换成:Person::getName表达式:() -> new HashMap();可以替换成:...
    99+
    2023-09-22
    jvm java Powered by 金山文档
  • linux shell (()) 双括号运算符的用法
    本篇内容介绍了“linux shell (()) 双括号运算符的用法”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!使用方法: 语法: ((表...
    99+
    2023-06-13
  • C++双冒号怎么使用
    这篇文章主要介绍了C++双冒号怎么使用的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇C++双冒号怎么使用文章都会有所收获,下面我们一起来看看吧。一、作用域符号:作用域符号 :: 的前面一般是类名称,后面一般是该...
    99+
    2023-07-05
  • 详解JAVA之运算符
    目录一、算术运算符二、赋值运算符三、自增自减运算符四、关系运算符五、逻辑运算符六、三元运算符七、数据输入总结一、算术运算符 运算符:常见的±*/等 表达式:运算符连接起来符合java...
    99+
    2024-04-02
  • C++双目运算符+=的重载详解
    目录1、+=重载2、friend重载+=3、运算符3.1 单目运算符3.2 双目运算符3.3 三目运算符4、重载++和重载- -总结1、+=重载 class Complex { ...
    99+
    2024-04-02
  • kotlin中::双冒号如何使用
    这篇文章主要介绍“kotlin中::双冒号如何使用”,在日常操作中,相信很多人在kotlin中::双冒号如何使用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”kotlin中::双冒号如何使用”的疑惑有所帮助!...
    99+
    2023-07-06
  • Java六类运算符详解
    目录算数运算符关系运算符逻辑运算符赋值运算符字符串连接运算符条件运算符在 Java 语言中,运算符有算数运算符、关系运算符、逻辑运算符、赋值运算符、字符串连接运算符、条件运算符。 算...
    99+
    2023-03-21
    算数运算符 关系运算符 逻辑运算符 赋值运算符 字符串连接运算符 条件运算符
  • 详解Java中的运算符
    本篇文章为大家展示了详解Java中的运算符,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。Java的运算符,分为四类:算数运算符、关系运算符、逻辑运算符、位运算符。算数运算符(9):+ - * / %...
    99+
    2023-05-31
    java 运算符 ava
  • php中的双冒号如何使用
    这篇文章主要介绍“php中的双冒号如何使用”,在日常操作中,相信很多人在php中的双冒号如何使用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”php中的双冒号如何使用”的疑惑有所帮助!接下来,请跟着小编一起来...
    99+
    2023-06-29
  • Go 冒号等于运算符和一个新变量
    php小编新一在这里为大家介绍一项新的特性——Go 冒号等于运算符和一个新变量。这个运算符的作用是在Go语言中创建一个新的变量,同时将其初始化为一个表达式的值。这个特性的引入使得代码更...
    99+
    2024-02-10
    go语言
  • Java 运算符详情
    目录1、算术运算符2、关系运算符3、逻辑运算符4、位运算符5、赋值运算符6、条件运算符7、instanceof 运算符Java 中的运算符与 C 语言基本一致。 1、算术运算符 ...
    99+
    2024-04-02
  • 使用@Cacheable缓存解决双冒号::的问题
    目录@Cacheable缓存解决双冒号::Cacheable的使用总结常规使用方法@Cacheable缓存解决双冒号:: 使用spring-data-redis2.x版本时,@Cac...
    99+
    2024-04-02
  • Java运算符优先级详解
    本篇内容介绍了“Java运算符优先级详解”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!Java运算符优先级详解 优先级是指同一式子中多个运算...
    99+
    2023-06-03
  • C++学习之算术运算符使用详解
    目录1. 前言2. 运算符种类3. 算术运算符3.1 功能描述3.2 运算符重载问题3.3 两数相除的问题3.4 关 于/和%运算符的正、负问题3.5 数据溢出问题3.6 类型转换3...
    99+
    2024-04-02
  • python运算符号详细介绍
    目录比较运算符布尔运算符python中的位运算符运算符的优先级比较运算符 a,b=10,30 print('a>b吗?',a>b) print('a<b吗?'...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作