数组中::双冒号含义

博客介绍了数组中::符号的使用。对于三维数组,如a[:,:,::-1]可实现纵坐标以中心为轴对称翻转等;对于二维数组,a[:,2::]可忽略前两列显示后面列数等,展示了不同操作下数组元素的选取方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

数组中的::意思:

  • 三维数组

    • a[:,:,::-1] 纵坐标以中心为轴,对称翻转
    • a[:,:,:3] 截取至第二列(从0开始)
    • a[:,:,3] 取出第三列的值(从0开始)
  • 二维数组

    • a[:,2::] 忽略前两列,显示后面所有列数
    • a[:,::2] 从第一列开始(包含第一列以此类推),隔2个显示一个
    • a[::2,:] 从第一行开始(包含第一行以此类推),隔2个显示一个

<think>我们被要求解释Java中的双冒号(::)操作符的含义和用法。根据提供的引用,我们可以总结如下:双冒号(::)操作符是Java8引入的,用于方法引用(methodreference)。它是lambda表达式的一种简写形式,使得代码更简洁。当lambda表达式仅仅调用一个已经存在的方法时,可以使用方法引用来替代。 引用中提到了双冒号操作符的几种使用场景:1.引用静态方法2.引用特定对象的实例方法3.引用特定类型的任意对象的实例方法4.引用超类(父类)的实例方法5.引用类构造方法6.引用数组构造方法我们将逐一解释这些场景,并给出示例。 另外,根据引用[4],双冒号操作符的学名叫做eta-conversion(η-转换)。它的作用就是直接引用已经存在的方法,而不是通过lambda表达式再写一遍。下面我们详细展开。</think>### Java双冒号(::)操作符详解 双冒号操作符(`::`)是Java 8引入的**方法引用**运算符,本质是lambda表达式的简化写法,用于直接引用已存在的方法而不创建新方法。其核心作用是**提高代码简洁性和可读性**,尤其在函数式编程中广泛应用[^2][^4]。 --- #### 一、核心作用 | 场景 | Lambda表达式 | 双冒号等价写法 | |------|--------------|----------------| | 调用静态方法 | `() -> Math.sqrt(x)` | `Math::sqrt` | | 调用实例方法 | `s -> s.length()` | `String::length` | | 调用构造函数 | `() -> new ArrayList<>()` | `ArrayList::new` | --- #### 二、六大使用场景及示例 1. **引用静态方法** ```java // Lambda Function<Double, Double> sqrt = x -> Math.sqrt(x); // 双冒号 Function<Double, Double> sqrt = Math::sqrt; ``` 2. **引用特定对象的实例方法** ```java String prefix = "ID-"; // Lambda Function<String, String> addPrefix = s -> prefix.concat(s); // 双冒号 Function<String, String> addPrefix = prefix::concat; ``` 3. **引用任意对象的实例方法** ```java // Lambda BiPredicate<String, String> equals = (a,b) -> a.equals(b); // 双冒号(类名::方法名) BiPredicate<String, String> equals = String::equals; ``` 4. **引用超类方法** ```java class Child extends Parent { void process() { // 调用父类toString Runnable parentAction = super::toString; } } ``` 5. **引用构造函数** ```java // Lambda Supplier<List<String>> listSupplier = () -> new ArrayList<>(); // 双冒号 Supplier<List<String>> listSupplier = ArrayList::new; ``` 6. **引用数组构造函数** ```java // 创建String数组 Function<Integer, String[]> arrayCreator = String[]::new; String[] arr = arrayCreator.apply(5); // 长度为5的数组 ``` --- #### 三、底层原理 双冒号操作符本质是**函数式接口的语法糖**,编译后生成与lambda相同的字节码: ```mermaid graph LR A[双冒号表达式] --> B[编译器解析] B --> C[生成invokedynamic指令] C --> D[绑定方法句柄MethodHandle] D --> E[实现函数式接口] ``` --- #### 四、最佳实践场景 1. **Stream API链式调用** ```java List<String> names = students.stream() .map(Student::getName) // 替代s->s.getName() .collect(Collectors.toList()); ``` 2. **事件处理器简化** ```java button.addActionListener(event -> handleClick()); // Lambda button.addActionListener(this::handleClick); // 双冒号 ``` 3. **工厂模式创建对象** ```java Map<String, Supplier<Shape>> factories = Map.of( "circle", Circle::new, "rect", Rectangle::new ); Shape circle = factories.get("circle").get(); ``` --- #### 五、与Lambda表达式对比 | 特性 | Lambda表达式 | 双冒号操作符 | |------|-------------|-------------| | 代码量 | 需完整参数和方法体 | 直接引用方法名 | | 可读性 | 中等 | 高(语义更明确) | | 适用场景 | 复杂逻辑 | 简单方法调用 | | 调试难度 | 较高(匿名类) | 较低(直接链接) | > **选择原则**:当lambda仅调用**单个已存在方法**时,优先使用双冒号操作符[^1][^3]。 --- ### 总结 双冒号操作符通过`类名::方法名`的简洁语法: 1. 消除冗余的lambda模板代码 2. 提升集合操作和函数式编程的可读性 3. 保持类型安全(编译器验证方法签名) 4. 与Java现有API(如Stream, Optional)无缝集成 适用于任何需要**传递方法作为参数**的场景,是编写现代Java代码的核心技巧之一[^4]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值