:: 是什么语法?

理解 Java8 中双冒号 “ :: “ 的用法,方法引用符 Java8 中,双冒号 :: 称为“方法引用操作符”,:: 符号为引用运算符,而它所在的表达式被称为方法引用,我们可以使用它来引用类的方法。 阅读详情

来源:blog.youkuaiyun.com/vbirdbest/article/details/80207673

  • 一:简洁

  • 二:方法引用

  • 三:Optional 可选值


一:简洁

方法引用分为三种,方法引用通过一对双冒号:: 来表示,方法引用是一种函数式接口的另一种书写方式

  • 静态方法引用,通过类名::静态方法名, 如 Integer::parseInt

  • 实例方法引用,通过实例对象::实例方法,如 str::substring

  • 构造方法引用,通过类名::new, 如 User::new

二:方法引用

public final class Integer {
    public static int parseInt(String s) throws NumberFormatException {
        return parseInt(s,10);
    }
}

通过方法引用,可以将方法的引用赋值给一个变量,通过赋值给Function,说明方法引用也是一种函数式接口的书写方式,Lambda表达式也是一种函数式接口,Lambda表达式一般用于自己提供方法体,而方法引用一般直接引用现成的方法。

public class User {
    private String username;
    private Integer age;

    public User() {
    }

    public User(String username, Integer age) {
        this.username = username;
        this.age = age;
    }

    @Override
    public String toString() {
        return "User{" +
                "username='" + username + '\'' +
                ", age=" + age +
                '}';
    }

    // Getter&Setter
}
public static void main(String[] args) {
    // 使用双冒号::来构造静态函数引用
    Function<String, Integer> fun = Integer::parseInt;
    Integer value = fun.apply("123");
    System.out.println(value);

    // 使用双冒号::来构造非静态函数引用
    String content = "Hello JDK8";
    Function<Integer, String> func = content::substring;
    String result = func.apply(1);
    System.out.println(result);

    // 构造函数引用
    BiFunction<String, Integer, User> biFunction = User::new;
    User user = biFunction.apply("mengday", 28);
    System.out.println(user.toString());

    // 函数引用也是一种函数式接口,所以也可以将函数引用作为方法的参数
    sayHello(String::toUpperCase, "hello");
}

// 方法有两个参数,一个是
private static void sayHello(Function<String, String> func, String parameter){
    String result = func.apply(parameter);
    System.out.println(result);
}

三:Optional 可选值

在Google Guava 中就有Optional,在Swift语言中也有这样类似的语法,在Swift中将可选值作为一种数据类型,地位和基本类型平齐平做,地位非常高。

/**
 * @since 1.8
 */
public final class Optional<T> {
    private static final Optional<?> EMPTY = new Optional<>();

    private final T value;

    private Optional() {
        this.value = null;
    }

    // 返回一个空的 Optional实例
    public static<T> Optional<T> empty() {
        @SuppressWarnings("unchecked")
        Optional<T> t = (Optional<T>) EMPTY;
        return t;
    }

    private Optional(T value) {
        this.value = Objects.requireNonNull(value);
    }

    // 返回具有 Optional的当前非空值的Optional
    public static <T> Optional<T> of(T value) {
        return new Optional<>(value);
    }

    // 返回一个 Optional指定值的Optional,如果非空,则返回一个空的 Optional
    public static <T> Optional<T> ofNullable(T value) {
        return value == null ? empty() : of(value);
    }

    // 如果Optional中有一个值,返回值,否则抛出 NoSuchElementException 。
    public T get() {
        if (value == null) {
            throw new NoSuchElementException("No value present");
        }
        return value;
    }

    // 返回true如果存在值,否则为 false
    public boolean isPresent() {
        return value != null;
    }

    // 如果存在值,则使用该值调用指定的消费者,否则不执行任何操作。
    public void ifPresent(Consumer<? super T> consumer) {
        if (value != null)
            consumer.accept(value);
    }

    // 如果一个值存在,并且该值给定的谓词相匹配时,返回一个 Optional描述的值,否则返回一个空的 Optional
    public Optional<T> filter(Predicate<? super T> predicate) {
        Objects.requireNonNull(predicate);
        if (!isPresent())
            return this;
        else
            return predicate.test(value) ? this : empty();
    }

    // 如果存在一个值,则应用提供的映射函数,如果结果不为空,则返回一个 Optional结果的 Optional 。
    public<U> Optional<U> map(Function<? super T, ? extends U> mapper) {
        Objects.requireNonNull(mapper);
        if (!isPresent())
            return empty();
        else {
            return Optional.ofNullable(mapper.apply(value));
        }
    }

    // 如果一个值存在,应用提供的 Optional映射函数给它,返回该结果,否则返回一个空的 Optional 。
    public<U> Optional<U> flatMap(Function<? super T, Optional<U>> mapper) {
        Objects.requireNonNull(mapper);
        if (!isPresent())
            return empty();
        else {
            return Objects.requireNonNull(mapper.apply(value));
        }
    }

    // 如果值存在,就返回值,不存在就返回指定的其他值
    public T orElse(T other) {
        return value != null ? value : other;
    }


    public T orElseGet(Supplier<? extends T> other) {
        return value != null ? value : other.get();
    }

    public <X extends Throwable> T orElseThrow(Supplier<? extends X> exceptionSupplier) throws X {
        if (value != null) {
            return value;
        } else {
            throw exceptionSupplier.get();
        }
    }
}

关于of方法,现在好像很流行,就是提供一个static方法,方法名称叫of,方法的返回值返回当前类,并且把构造函数设置为私有private,用静态of方法来代替构造函数。

public class User {
    private String username;
    private Integer age;

    private User() {
    }

    public static User of() {
        return new User();
    }

    private User(String username, Integer age) {
        this.username = username;
        this.age = age;
    }

    public static User of(String username, Integer age) {
        return new User(username, age);
    }
}

Main

public static void main(String[] args) {
    // Optional类已经成为Java 8类库的一部分,在Guava中早就有了,可能Oracle是直接拿来使用了
    // Optional用来解决空指针异常,使代码更加严谨,防止因为空指针NullPointerException对代码造成影响
    String msg = "hello";
    Optional<String> optional = Optional.of(msg);
    // 判断是否有值,不为空
    boolean present = optional.isPresent();
    // 如果有值,则返回值,如果等于空则抛异常
    String value = optional.get();
    // 如果为空,返回else指定的值
    String hi = optional.orElse("hi");
    // 如果值不为空,就执行Lambda表达式
    optional.ifPresent(opt -> System.out.println(opt));
}

END

verilog语法中+:和-:用法 verilog语法中+:和-:主要用来进行位选择。 位选择从向量net、向量 reg、整数变量或时间变量中提取特定位。可以使用表达式寻址该位。如果位选择超出地址边界或位选择为 x 或 z,则引用返回的值应为 x。声明为实时或实时的变量的位选择或部分选择应被视为非法。 向量net、向量 reg、整数变量或时间变量中的几个连续位可以被寻址,称为部分选择。有两种类型的部分选择,常量部分选择和索引部分选择。 向量 reg 或 net 的常量部分选择由以下语法给出: vect[msb_expr:lsb... 阅读详情

相关推荐

(168)Verilog HDL“+:”语法与“-:”语法

1)文章目录2)FPGA入门与提升课程介绍3)FPGA简介4)Verilog HDL“+:”语法与“-:”语法5)技术交流6)参考资料1)FPGA入门与提升文章目的是为了让想学FPGA的小伙伴快速入门以及能力提升;2)FPGA基础知识;3)Verilog HDL基本语法;4)FPGA入门实例;5)FPGA设计输入,包括代码输入、原语输入;6)FPGA设计技巧;7)FPGA时钟设计;8)FPGA复位设计;9)FPGA IP核设计;10)FPGA初始值设置;11)FPGA约束方法;12)FPGA能力提升等。FP

m0_46498597的博客 1454

java中的双冒号操作符

java中的双冒号操作符 定义 双冒号运算操作符是类方法的句柄,lambda表达式的一种简写,这种简写的学名叫eta-conversion或者叫η-conversion。 通常的情况下: 把 x -> System.out.println(x) 简化为 System.out::println 的过程称之为 eta-conversion 把 System.out::println 简化为 x -> System.out.println(x) 的过程称之为 eta-expansion 范式: 类名:

星星点灯 488

【IIC通信】Chap.1(I2C)IIC通信原理、IIC读写时序详解

IIC通信以两根连线SDA、SCL实现了完善的全双工同步数据传送, 可以方便地构成多机系统和外围器件扩展系统。

Jie_MSD的博客 2万+

java8_双冒号

java8_双冒号双冒号使用场景一代替type 双冒号 双冒号实际上是返回了一个Consumer类型 import java.util.function.Consumer; 实例名::方法名 其中返回的Consumer代表传递的参数 package com.qbsea.knowledge.jdk8z; import java.util.Arrays; import java.util.List; import java.util.function.Consumer; public class TwoCol

maqingbin8888的专栏 485

Zynq 【SDK裸机开发之PS】——DDR的内存分配使用详解

Zynq如果跑操作系统的话,内存管理的工作都会交给系统来操作,但是如果是裸机的话,则需要自己对DDR3的内存进行管理。

shizhibuyi1234的博客 7381

IAP板卡远程升级(串口网口都可)+Ymodem+AES对bin文件加密+pc软件+板卡相互烧录

还是决定记录一下,毕竟这个东西我也搞了挺久的,遇到一些棘手的,或者是因为我很粗心遇到的问题也和大家分享一下,。 板卡核心是 STM32F103RCT6,256kflash 前言 开始看这个远程升级的时候,我是一头雾水的,原子哥的教程里面也有说到过iap,有了一个大概的了解,我想不明白的是,通过串口下载的方式把hex文件下载到flash,和把bin文件下载到flash难道不是拉一根线,下载一个文件嘛,(初入职场的我并没有考虑到安全这个问题)如果直接将hex文件给到客户那边,风险是非常大...

那可真是太开心了的博客 5371

深入理解Java双冒号(::)运算符的使用(*)

Jdk8中有好多新的特性,比如引入Lambda,简化代码的书写等等 我们先看一个关于Lambda的使用 /** * 输出list */ @Test public void test() { String[] array = {"aaaa", "bbbb", "cccc"}; List<String> list = Arrays.asList(array); //Java 7 for(String s:list){ System.out.println(s); } //

weixin_42408447的博客 4947

Xilinx XDMA驱动代码分析及用法

Xilinx XDMA驱动代码分析及用法 先简单的介绍一下,赛灵思的XDMA的驱动是用于做什么的、他的主要功能就类似与网卡pcie接口的网卡驱动、用于控制主机与fpga设备进行pcie的通讯。通讯的主要方式是设备文件的读写,这里不清楚的同学可以看一下我上一篇文章。通过控制设备文件的读写,操作驱动与fpga设备进行数据传输。 1、目录结构 zacha@Superman:~/nfs/xdma-debug/dma_ip_drivers-master/XDMA/linux-kernel$ tree -C . ├──

恍恍惚惚的大穷猫的博客 3万+

Verilog +: -:语法

“+:”、"-:"语法 看到这个语法的时候是在分析AXI lite 总线源码时碰见的,然后查阅了资料,做出如下解释。 1.用处 这两个应该算是运算符,运用在多位的变量中,如下: slv_reg0[(byte_index8) +: 8] <= S_AXI_WDATA[(byte_index8) +: 8]; 2."+:" 变量[起始地址 +: 数据位宽] <–等价于–> 变量[(起始地址+数据位宽-1):起始地址] data[0 +: 8] <--等价于--> data[7

我看唔人生 4万+

AutoDL上传数据详细步骤(自己用的步骤,可能没有其他大佬用的那么高级)

AutoDL上传数据详细步骤(自己用的步骤,可能没有其他大佬用的那么高级)

孟孟单单的博客 7万+

【第48例】BLM模型之市场洞察-五看工具篇(一)

BLM市场洞察

产品线负责人 2113

Verilog语法+:和-:有什么用?

Verilog语法+:和-:主要用于位选择,可以让代码更简洁。

mengzaishenqiu的博客 1850

SimSwap复现指引及代码分析【2023有更新】

我的环境!!!😚😚😚 之后会遇到:还会遇到至此环境配置完毕!下面是所需要的checkpoint。至此环境准备结束。先试试环境是否有问题,图片是代码包中给的。我用的是512的checkpoint,无水印,a是源脸,b是目标脸。输出到./output/result_whole_swapsingle.jpg 如图是可以成功换脸的:(为了方便查看将图像裁剪到了128x128) 表示图像预处理,相应的改为也是一样。不加就是对已经面部对齐的图像进行简单的面部交换。 加上就是无水印。 交换一张图片中的所有面孔。

zik的博客 2050

Spring Boot中的this::语法糖详解

本文深入探讨了Java 8方法引用特性this::在Spring Boot开发中的应用。首先介绍了方法引用的四种类型:静态方法引用、实例方法引用、任意对象方法引用和构造器引用。随后重点分析了this::语法在Spring Boot中的典型应用场景:Service层的Stream操作和异步处理、Controller层的数据转换、配置类中的Bean定义以及事件处理机制。通过多个代码示例展示了如何使用this::简化代码,使其更加简洁和易读。这些技术细节的掌握可以帮助开发者更高效地编写Spring Boot应用程

hello! 1015

CANFD加速是什么?和CANFD有什么区别?

在使用CAN设备上位机的时候,已经选择了CANFD,但还有一个选项是“CANFD加速”,那CANFD加速和不加速有什么区别呢?刚接触CANFD小伙伴肯定一脸懵,本篇主要是给大家分享一下他们的区别,如果对你有帮助,请转发,收藏,点赞💐🎉👍😊

汽车电子软件领域知识分享 1040

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

verilog语法之数据位宽[+:][-:]

big_value[15-:8] **(注意不是big_value[15-:7])**等价于 big_value[15:8]big_value[7-:8] **(注意不是big_value[7-:7] )**等价于 big_value[7:0]big_value[8+:8] **(注意不是big_value[8+:7])**等价于 big_value[15:8]其中base_expr表示起始bit,width_expr表示位宽。等价于 big_value[7:0]

m0_46795246的博客 4432

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

【PYG】切片语法[:,]

:, :]:选择整个二维数组或张量。[:, :10]:选择二维数组或张量的前 10 列。这种语法在处理多维数据时非常方便,可以用于选择特定的子数组或子张量。

Never Give Up 434

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

JSP语法 jsp:include

 包含一个静态或动态文件.     JSP 语法    relativeURL |  expression%>}"   flush="true" /> or relativeURL | expression %>}"   flush="true" >         parameterName" value="{par

twosecond 385

java::语法糖以及函数式接口

spring源码阅读过程中的收获 @FunctionalInterface 函数式接口,函数式接口,首先是一个接口,然后就是在这个接口里面只能有一个抽象方法。 @FunctionalInterface public interface ContextInitialize { void doIt(String param); } 更多相关的介绍请看这篇博客https:/...

Tomshidi的博客 465

Vue- 对象语法 v-bind:class与对象语法的使用(重要)

我们可以传给 v-bind:class 一个对象,以动态地切换 class 。 div v-bind:class="{ active: isActive }">div>//对象语法也就是在v-bind:class绑定一个对象的时候,里面的值将影响最终取值,//比如如果 这里isActive的值为true 则会被渲染成class='active' 如果为false , 则

heartOfblack 离开了电脑,我不希望我还有病 3万+

tcl语法 ::env

在 Tcl 中,set target_name $::env(TARGET_NAME) 的作用是 ‌将系统环境变量 TARGET_NAME 的值赋给 Tcl 变量 target_name‌。puts “错误:未定义环境变量 TARGET_NAME”‌功能‌:Tcl 的 set 命令用于创建或修改变量。$env(PATH) 表示系统的 PATH 环境变量。‌(2) 依赖环境变量的逻辑‌。‌(1) 环境变量存在性检查‌。‌(1) set 命令‌。‌(1) 读取环境变量‌。‌(2) 作用域问题‌。

有人说学习`这个`最好的时间是十年前,有人说最好的时间是现在,众说纷纭... 1180

php classNameL::class 语法

php classNameL::class 语法 自 PHP 5.5 起,关键词 class 也可用于类名的解析。 使用 ClassName::class 可以获取一个字符串,包含了类 ClassName 的完全限定名称。这对使用了命名空间的类尤其有用。 ...

xubohaojiaojiao的博客 637

PHP语法糖->,::和=>

PHP语法糖->,::和=> 双冒号:: 是作用域限定操作符(Scope Resolution Operator),左边是作用域,右边是访问作用域的成员。可以用于访问静态成员、方法和常量,还可以用于覆盖类中的成员和方法。也就是意味着调用冒号的左边这一部分调用冒号的右边这一部分。这样一个含义。so。。左边不能写self。因为self。因为self。因为self先解析,除非前面就定义了$self这个变量是指向自己的。 在PHP中定义作用域的有self和parent,在PHP6中提供了static作用

NetWD_WestWD的博客 351

Laravel源码里面为什么要用::class语法?

源问题:https://www.zhihu.com/question/52656676 自 PHP 5.5 起,关键词 class 也可用于类名的解析。使用 ClassName::class 你可以获取一个字符串,包含了类 ClassName 的完全限定名称。这对使用了 命名空间 的类尤其有用。 $app->singleton( Illuminate\Contracts\H

博客搬家啦 1189

vue中:class语法的{}[]两种用法及其使用场景例子

而需求是点哪个就高亮哪个,所以可以用一个值来记住点的是哪个,这里其实记item.id可以,下标index也是可以的,这里就用下标展示吧。这里有三个tab,给第一个tab设置class为“active ” ,并在上面的标签里面给class为“active ”的类设置了红底白字的样式属性进行渲染。② 传数组 →数组中所有的类,都会添加到盒子上,这样这些类所设置的样式就会被渲染出来,本质就是一个 class 列表。去a标签里面的:class里面把判断条件写完整,即点击的下标是不是记录的这个。

SSHLY3的博客 4300
上一篇: 一连发布三个版本,Boot要上天?
下一篇: 【附下载】能挣钱的,开源 SpringBoot 商城系统,功能超全,超漂亮,真TMD香!...
Java思维导图
博客等级 码龄10年 306粉丝 71原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值