精华内容
下载资源
问答
  • Java中双冒号操作符是Java 8中的Lambda表达式写法之一,对于Lambda表达式潘老师之前也写过总结的博文,大家可执行在博客中搜索,下面我们来看一下我们应该如何理解并使用Java中双冒号操作符。 一、定义与理解 1、...

    Java中双冒号操作符是Java 8中的Lambda表达式写法之一,对于Lambda表达式潘老师之前也写过总结的博文,大家可执行在博客中搜索,下面我们来看一下我们应该如何理解并使用Java中双冒号操作符。

    一、定义与理解

    1、定义
    双冒号运算操作符是类方法的句柄,lambda表达式的一种简写,这种简写的学名叫eta-conversion或者叫η-conversion。

    2、理解
    英文格式双冒号::,读:double colon,双冒号(::)运算符在Java 8中被用作方法引用(method reference),方法引用是与lambda表达式相关的一个重要特性。它提供了一种执行方法的方法,为此,方法引用需要由兼容的函数式接口组成的目标类型上下文。

    Method References(关于方法引用的描述-来自Oracle官网)
    You use lambda expressions to create anonymous methods. Sometimes, however, a lambda expression does nothing but call an existing method. In those cases, it’s often clearer to refer to the existing method by name. Method references enable you to do this; they are compact, easy-to-read lambda expressions for methods that already have a name.

    大概意思就是,使用lambda表达式会创建匿名函数, 但有时候需要使用一个lambda表达式只调用一个已经存在的方法(不做其它), 所以这才有了方法引用!

    二、使用

    1、使用场景
    双冒号(::)使用场景一般有如下6种:

    2、案例详解
    2.1)引用静态方法

    import org.junit.Test;
    import java.util.Arrays;
    import java.util.List;
     
    public class Colon{
        @Test
        public void test(){
            List<String> list = Arrays.asList("a","b","c");
            //静态方法引用  ClassName::methodName
            list.forEach(Colon::print);
            //上一行等价于
            //list.forEach((x)->Colon.print(x));
        }
        //静态方法
        public static void print(String s){
            System.out.println(s);
        }
    }
    

    2.2)引用特定对象实例方法

    import org.junit.Test;
    import java.util.Arrays;
    import java.util.List;
     
    public class Colon{
        @Test
        public void test(){
            List<String> list = Arrays.asList("a","b","c");
            //实例方法引用  instanceRef::methodName
            list.forEach(new Colon()::print);
            //上一行等价于
            //list.forEach((x)->new Colon().print(x));
        }
        //实例方法
        public void print(String s){
            System.out.println(s);
        }
    }
    

    2.3)引用特定类型的任意对象的实例方法

    import org.junit.Test;
    import java.util.Arrays;
     
    public class Colon{
        @Test
        public void test(){
            String[] arr = { "Barbara", "James", "Mary", "John",
                    "Patricia", "Robert", "Michael", "Linda" };
            //引用String类型的任意对象的compareToIgnoreCase方法实现忽略大小写排序
            Arrays.sort(arr, String::compareToIgnoreCase);
            //上一行等价于
            //Arrays.sort(arr, (a,b)->a.compareToIgnoreCase(b));
            //输出
            for(String s:arr){
                System.out.println(s);
            }
        }
    }
    

    注意:不要和引用静态方法搞混,认为为什么compareToIgnoreCase是非静态方法却可以使用类名去引用,这两者根本不是一回事,双冒号前的类含义也不同,就是两个应用方向

    运行结果如下:

    2.4)引用超类(父类)实例方法

    import org.junit.Test;
    import java.util.Arrays;
    import java.util.List;
     
    public class Colon extends BaseColon{
        @Test
        public void test(){
            List<String> list = Arrays.asList("a","b","c");
            //实例方法引用  instanceRef::methodName
            list.forEach(super::print);
        }
    }
    class BaseColon{
        //实例方法
        public void print(String s){
            System.out.println(s);
        }
    }
    

    2.5)引用类构造方法
    一般我们需要声明接口,该接口作为对象的生成器,通过 类名::new 的方式来实例化对象,然后调用方法返回对象。

    //注意:该类无需实现接口
    public class Colon{
        private String name;
        private int age;
        //无参构造
        public Colon() {
        }
        //有参构造
        public Colon(String name, int age) {
            this.name = name;
            this.age = age;
        }
     
        public static void main(String[] args) {
            //无参构造引用
            ColonNoParam cnp = Colon::new;
            Colon c1 = cnp.createColon();
            System.out.println(c1);
            //有参构造引用
            ColonWithParam cwp = Colon::new;
            Colon c2 = cwp.createColon("小明",20);
            System.out.println(c2);
        }
     
        //生成toString方法打印查看
        @Override
        public String toString() {
            return "Colon{" +
                    "name='" + name + '\'' +
                    ", age=" + age +
                    '}';
        }
    }
    interface ColonNoParam{
        //无参方法提供对象
        Colon createColon();
    }
    interface ColonWithParam{
        //有参方法提供对象(数据类型要与Colon有参构造函数对应)
        Colon createColon(String s,int i);
    }
    

    运行结果可以看下:

    2.6)引用数组构造方法
    我们可以借助jdk自带的java.util.function.Function类实现对数组构造函数的引用。

    import java.util.function.Function;
     
    public class Colon{
     
        public static void main(String[] args) {
            Function<Integer,Colon[]> function = Colon[]::new;
            //调用apply方法创建数组,这里的5是数组的长度
            Colon[] arr = function.apply(5);
            //循环输出-初始都为null
            for(Colon c:arr){
                System.out.println(c);
            }
        }
    }
    

    当然,我们也可以使用@FunctionalInterface自定义函数式接口来实现:

    public class Colon{
     
        public static void main(String[] args) {
            MyArrayFunction<Integer,Colon[]> function = Colon[]::new;
            //调用apply方法创建数组,这里的5是数组的长度
            Colon[] arr = function.apply(5);
            //循环输出-初始都为null
            for(Colon c:arr){
                System.out.println(c);
            }
        }
    }
    //自定义函数式接口
    @FunctionalInterface
    interface MyArrayFunction<A,T>{
        T apply(A a);
    }
    

    三、总结

    以上就是Java中双冒号(::)运算操作符使用方式,在一定程度上简化了我们Java开发的冗余代码,但也增加了我们的Java学习难度,如果你无法理解此种用法,最好不使用就可以了,以免出错!

    展开全文
  • Java中双冒号操作符是Java 8中的Lambda表达式写法之一,对于Lambda表达式小编之前也写过总结的博文,大家可执行在博客中搜索,下面我们来看一下我们应该如何理解并使用Java中双冒号操作符。一、定义与理解1、定义...

    Java中双冒号操作符是Java 8中的Lambda表达式写法之一,对于Lambda表达式小编之前也写过总结的博文,大家可执行在博客中搜索,下面我们来看一下我们应该如何理解并使用Java中双冒号操作符。

    一、定义与理解

    1、定义

    双冒号运算操作符是类方法的句柄,lambda表达式的一种简写,这种简写的学名叫eta-conversion或者叫η-conversion。

    2、理解

    英文格式双冒号::,读:double colon,双冒号(::)运算符在Java 8中被用作方法引用(method reference),方法引用是与lambda表达式相关的一个重要特性。它提供了一种执行方法的方法,为此,方法引用需要由兼容的函数式接口组成的目标类型上下文。

    Method References(关于方法引用的描述-来自Oracle官网)
    You use lambda expressions to create anonymous methods. Sometimes, however, a lambda expression does nothing but call an existing method. In those cases, it’s often clearer to refer to the existing method by name. Method references enable you to do this; they are compact, easy-to-read lambda expressions for methods that already have a name.

    大概意思就是,使用lambda表达式会创建匿名函数, 但有时候需要使用一个lambda表达式只调用一个已经存在的方法(不做其它), 所以这才有了方法引用!

    二、使用

    1、使用场景

    双冒号(::)使用场景一般有如下6种:

    6d38d3b42caa3dc72405fdd83c6553ec.png

    2、案例详解

    2.1)引用静态方法

    import org.junit.Test;
    import java.util.Arrays;
    import java.util.List;
     
    public class Colon{
        @Test
        public void test(){
            List<String> list = Arrays.asList("a","b","c");
            //静态方法引用  ClassName::methodName
            list.forEach(Colon::print);
            //上一行等价于
            //list.forEach((x)->Colon.print(x));
        }
        //静态方法
        public static void print(String s){
            System.out.println(s);
        }
    }

    2.2)引用特定对象实例方法

    import org.junit.Test;
    import java.util.Arrays;
    import java.util.List;
     
    public class Colon{
        @Test
        public void test(){
            List<String> list = Arrays.asList("a","b","c");
            //实例方法引用  instanceRef::methodName
            list.forEach(new Colon()::print);
            //上一行等价于
            //list.forEach((x)->new Colon().print(x));
        }
        //实例方法
        public void print(String s){
            System.out.println(s);
        }
    }

    2.3)引用特定类型的任意对象的实例方法

    import org.junit.Test;
    import java.util.Arrays;
     
    public class Colon{
        @Test
        public void test(){
            String[] arr = { "Barbara", "James", "Mary", "John",
                    "Patricia", "Robert", "Michael", "Linda" };
            //引用String类型的任意对象的compareToIgnoreCase方法实现忽略大小写排序
            Arrays.sort(arr, String::compareToIgnoreCase);
            //上一行等价于
            //Arrays.sort(arr, (a,b)->a.compareToIgnoreCase(b));
            //输出
            for(String s:arr){
                System.out.println(s);
            }
        }
    }
    注意:不要和引用静态方法搞混,认为为什么compareToIgnoreCase是非静态方法却可以使用类名去引用,这两者根本不是一回事,双冒号前的类含义也不同,就是两个应用方向

    运行结果如下:

    25277d948928760549d758116f4a7adb.png

    2.4)引用超类(父类)实例方法

    import org.junit.Test;
    import java.util.Arrays;
    import java.util.List;
     
    public class Colon extends BaseColon{
        @Test
        public void test(){
            List<String> list = Arrays.asList("a","b","c");
            //实例方法引用  instanceRef::methodName
            list.forEach(super::print);
        }
    }
    class BaseColon{
        //实例方法
        public void print(String s){
            System.out.println(s);
        }
    }

    2.5)引用类构造方法

    一般我们需要声明接口,该接口作为对象的生成器,通过 类名::new 的方式来实例化对象,然后调用方法返回对象。

    //注意:该类无需实现接口
    public class Colon{
        private String name;
        private int age;
        //无参构造
        public Colon() {
        }
        //有参构造
        public Colon(String name, int age) {
            this.name = name;
            this.age = age;
        }
     
        public static void main(String[] args) {
            //无参构造引用
            ColonNoParam cnp = Colon::new;
            Colon c1 = cnp.createColon();
            System.out.println(c1);
            //有参构造引用
            ColonWithParam cwp = Colon::new;
            Colon c2 = cwp.createColon("小明",20);
            System.out.println(c2);
        }
     
        //生成toString方法打印查看
        @Override
        public String toString() {
            return "Colon{" +
                    "name='" + name + ''' +
                    ", age=" + age +
                    '}';
        }
    }
    interface ColonNoParam{
        //无参方法提供对象
        Colon createColon();
    }
    interface ColonWithParam{
        //有参方法提供对象(数据类型要与Colon有参构造函数对应)
        Colon createColon(String s,int i);
    }

    运行结果可以看下:

    0cad3e6a7222ac9c19591a3844809af7.png

    2.6)引用数组构造方法

    我们可以借助jdk自带的java.util.function.Function类实现对数组构造函数的引用。

    import java.util.function.Function;
     
    public class Colon{
     
        public static void main(String[] args) {
            Function<Integer,Colon[]> function = Colon[]::new;
            //调用apply方法创建数组,这里的5是数组的长度
            Colon[] arr = function.apply(5);
            //循环输出-初始都为null
            for(Colon c:arr){
                System.out.println(c);
            }
        }
    }

    当然,我们也可以使用@FunctionalInterface自定义函数式接口来实现:

    public class Colon{
     
        public static void main(String[] args) {
            MyArrayFunction<Integer,Colon[]> function = Colon[]::new;
            //调用apply方法创建数组,这里的5是数组的长度
            Colon[] arr = function.apply(5);
            //循环输出-初始都为null
            for(Colon c:arr){
                System.out.println(c);
            }
        }
    }
    //自定义函数式接口
    @FunctionalInterface
    interface MyArrayFunction<A,T>{
        T apply(A a);
    }

    三、总结

    以上就是Java中双冒号(::)运算操作符使用方式,在一定程度上简化了我们Java开发的冗余代码,但也增加了我们的Java学习难度,如果你无法理解此种用法,最好不使用就可以了,以免出错!

    文章来源:如何理解并使用Java中双冒号(::)运算操作符
    原文作者:潘子夜
    来源平台:个人博客
    展开全文
  • 上一节我们已经学习了if条件语句,和if分支条件语句的使用。...那我们本节来看一下要如何将and、or、not应用到if条件表达式中。在条件表达式中使用andTrue and True --> TrueTrue and Flase --> FlaseFlase an...

    上一节我们已经学习了if条件语句,和if分支条件语句的使用。本节我们来看一下如果将多个表达式合并使用,就是我们之前学习布尔类型这节中,讲到的逻辑表达式,分别有and、or、not。那我们本节来看一下要如何将and、or、not应用到if条件表达式中。

    在条件表达式中使用and

    True  and True  --> TrueTrue  and Flase --> FlaseFlase and True  --> FlaseFlase and Flase --> Flase

    我们来看一个小例子:

    39946e25236963cc63d2592d6ddf15c2.png

    上图中,我们使用了and来连接两个条件表达式,当两个条件表达式都为True时,最终的结果为True。那如果这两个表达式中有一个表达式为False,那么最终结果就为False哟。

    我们再来看一个多个条件表达式的例子:

    6f61bcf2821ca6ae0984d043c3d670ca.png

    在条件表达式中使用or

    上面我们已经学习在如何在条件表示式中使用and,接下来我们讲一下or的使用,or和and不同之处在于,只要有一个条件表达式是True,最终结果就为True。

    True  or True  --> TrueTrue  or Flase --> TrueFlase or True  --> TrueFlase or Flase --> Flase

    我们来看一个例子:

    3abea2585450f1aaa0d62831be0e6c04.png

    这样来看的话,只要能够知道每个条件表达式是True还是False,就很容易知道最终结果了。

    在条件表达式中使用not

    not的意思为“不是”,用于否定条件,即如果条件是True,使用not后,最终结果会变为False,反之亦然。

    not True   --> Flasenot False  --> True
    af34b51270498bd5477dcb65a1f69b2e.png

    动手练习

    1.已知有a = 7,b = 9,c = 2,请问最终下列代码输出什么?

    a = 7b = 9c = 2if a > b and a > c:    print("a最大")elif b > a and b > c:    print("b最大")else:    print("c最大")

    2.有如下代码,请问下列代码的结果是什么?

    a = 1if not a == 2:    print("True")else:    print("False")

    参考:https://www.9xkd.com/

    展开全文
  • 双冒号::和单冒号:的使用

    千次阅读 2011-05-04 17:41:00
    在定义类的构造函数时,用:指定如何调用基类的构造函数和初始化成员变量;定义标号时后面要加:;此外还有:?表达式。   单冒号的作用有: (1)构造函数初始化成员变量。比如类C的构造函数 C::C():...

    ::用来指定名称所属的空间,以::开头表示全局,以命名空间或类名、结构名等加::指定该空间范围内定义的名称,可以是函数、变量、常量、类型等名称。
    :有多种用法,定义类时,在类名后面用:指定基类;在定义类的构造函数时,用:指定如何调用基类的构造函数和初始化成员变量;定义标号时后面要加:;此外还有:?表达式。

     

    单冒号的作用有:
    (1)构造函数初始化成员变量。比如类C的构造函数 C::C():param1(),param2(){}。
    (2)指定基类。比如:class Derive : public Base {...}
    (3)指定访问权限时,一般在定义结构或者类中使用。比如:public: ... protected:... private:...
    (2)三目运算符中有所使用。比如:a>b?1:2;

    ::是C++里的“作用域分解运算符”。比如声明了一个类A,类A里声明了一个成员函数voidf(),但没有在类的声明里给出f的定义,那么在类外定义f时,就要写成voidA::f(),表示这个f()函数是类A的成员函数。

      :: 一般还有一种用法,就是直接用在全局函数前,表示是全局函数。当类的成员函数跟类外的一个全局函数同名时,在类内定义的时候,打此函数名默认调用的是本身的成员函数;如果要调用同名的全局函数时,就必须打上::以示区别。比如在VC里,你可以在调用API函数时,在API函数名前加::。

    展开全文
  • <p>I would like to send this rest call ...... ...rows=100&core=gav </code></pre> ...<p>......q=g%3A%22ch.viascom.groundwork%22%2BAND%2Ba%3A%22foxhttp%22&...<pre class="lang-golang prettyprint-override">...
  • 共回答了16个问题采纳率:93.8%号,第二层用单书名号,最里面的第三层用书名号,这样就把三个x0d层次区分开了.例如:x0d(1)他接到一份文件,题目是《转发...不过在实际x0d使用中,应当尽量避免三层或更多层的引号、书...
  • 1. 前言Java中的方法引用,很多同学都见过但却叫不出名字,在这篇文章中,我们将看到什么是方法引用以及如何使用它。2. 方法引用的使用场景我们先来看看方法引用的使用:new Random().ints(10) .map(i->Math.abs...
  • 学完此次课程,我能做什么?... 先使用 javac + 文件名 + 扩展名(.java) 把java代码编译为二进制文件 文件名.class,然后使用 java + 文件名运行。如下图:通过入门程序,总结以下几点语法或者规范:1....
  • 如果id中存在冒号,例如<p id="aa:bb:cc">我是一个段落</p> 通过jquery直接使用#id值, 是找不到这个dom对象的,如果想要获取这个id,可以通过以下几种方式: 一、$("#aa\\:bb\\:cc")。 \\先转义为\...
  • 根据以往SEO工作的经历,蝙蝠侠IT,认为,你可能需要参考如下指标:1、URL简短URL简短是众中之重,很多SEO人员会认为,在URL中使用汉语拼音的全拼,有利于搜索引擎更好的解读URL的相关性,根据以往的实际测验。...
  • 特殊符号如何用电脑打出来?我们在使用电脑编写文章的时候,会碰到一些键盘上没有的符号。那么,这些符号要怎么打出来呢?下面就是用电脑快速打出特殊符号的方法,一起来看一下。常见的标点符号:分号(、)、书名号(...
  • 命名空间关键字:namespace namespace A { int x=1; } namespace B { int x=4; } 分别输出A和B空间x的值 cout <<A::x<...利用命名空间名加双冒号调用不同空间变量,endl用来换行。 ...
  • JSON就是一串字符串 只不过元素会使用特定的符号标注。 括号{} 表示对象 中括号[]表示数组 引号“”内是属性或值 冒号: 表示后者是前者的值(这个值可以是字符串、数字、也可以是另一个数组或对象) 所以 {...
  • 百分之90的人可能不知道如何正确地使用浏览器、 一下方法让你的浏览器使用效率极大提高 方法一:完全匹配关键字法“” 即可完全匹配到关键字。其所搜索到的结果,是展示这个完整关键字的结果。而非完整关键字中的...
  • 在小编我看来,python中函数的...在此bdjy是函数的名称,然后有一括号和冒号。里面的print语句即是函数的内容了哦,注意的是函数内容要缩进哦。2Python函数定义好之后不会自己执行,所以需要程序员调用它才可以生...
  • 类中的常量也就是成员常量,常量就是不会改变的量,是一个恒值。 定义常量使用关键字const. 例如:const PI = 3.1415326;...访问常量的格式都是类名加作用域操作符号(双冒号)来调用。 即:类名 :: 类常量名;...
  • 我们平时经常使用markdown完成一些诸如博客的文档写作,但是有时像我这种语言比较乏力的急需要...比如我想要表达开心即smile的表情,那么我只需要使用双冒号中间加入英文单词就可以啦,例如: :smile::smile::smile:  
  • 1.定义伪元素用于创建一些不在文档树中的元素,并为其添加样式。比如说,我们可以通过:before :after来在一个元素...在CSS3规范中的要求使用双冒号(::)表示伪元素,以此来区分伪元素和伪类;但为了向上兼容,现在用...
  • 利用css3来制作时间轴的知识...提示:亦可写成 :before :after CSS3将伪对象选择符前面的单个冒号(:)修改为双冒号(::)用以区别伪类选择符,但以前的写法仍然有效。 预览地址:http://www.yangqq.com/web/time.htm...
  • 在网站应用中使用JSON的场景越来越多,本文介绍 ASP.NET中JSON的序列化和反序列化,主要对JSON的简单介绍,ASP.NET如何序列化和反序列化的处理,在序列化和反序列化对日期时间、集合、字典的处理。 一、JSON简介 ...
  • 在shell中使用到for循环时,是通过IFS同样也是来定义分隔符...如何使用 IFS 字符解析数据没有任何限制。 那么下面三个的区别是什么呢? IFS='\n' //将字符\和字符n作为IFS的换行符。 IFS='\n' //与上面一样。 IFS...

空空如也

空空如也

1 2 3
收藏数 57
精华内容 22
关键字:

双冒号如何使用