【zz】 java函数参数类型后添加三点的用法

本文介绍了Java中可变参数列表的使用方法,包括其语法特点和调用方式。从Java5开始,开发者可以通过在参数类型后添加三个点来声明一个可以接收任意数量参数的方法。

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

今天看到一个没见过的函数参数列表test(int... a),查看资料,
原来是如下用法:

类型后面三个点(String...),是从Java 5开始,Java语言对方法参数支持一种新写法,
叫可变长度参数列表,其语法就是类型后跟...,表示此处接受的参数为0到多个Object
类型的对象,或者是一个Object[]。 例如我们有一个方法叫做test(String...strings),
那么你还可以写方法test(),但你不能写test(String[] strings),这样会出编译错误,
系统提示出现重复的方法。 
在使用的时候,对于test(String...strings),你可以直接用test()去调用,标示没有
参数,也可以用去test("aaa"),也可以用test(new String[]{"aaa","bbb"})。 
另外如果既有test(String...strings)函数,又有test()函数,我们在调用test()时,
会优先使用test()函数。只有当没有test()函数式,我们调用test(),程序才会走
test(String...strings)。
例:

[html]   view plain copy
  1. public class Ttest   
  2. {  
  3.     //private static int a;  
  4.     public  static  void test(int... a)  
  5.     {  
  6.         for(int i=0;i<a.length;i++)  
  7.         {  
  8.             System.out.println(a[i]);  
  9.         }  
  10.     }  
  11.     public static void main(String[] args)   
  12.     {  
  13.         Ttest.test(1,2);  
  14.     }  
  15. }  

<think>我们讨论的是Java 8中函数式编程,具体是关于无返回值、无参数的函数式接口。 在Java 8中,这样的接口是`Runnable`,它有一个抽象方法`void run()`,符合无参数、无返回值。 另外,我们也可以使用`Supplier`,但`Supplier`是有返回值的。所以这里我们关注`Runnable`。 但是,用户可能想了解如何定义和使用这样的函数式接口,或者使用Lambda表达式来实现。 示例代码: 我们可以写一个无参数、无返回值的方法,并使用Lambda表达式或方法引用来实现。 注意:用户问题中要求“无返回值无参数的”,所以我们只考虑`Runnable`接口。 另外,我们也可以自定义一个接口,但Java 8已经提供了`Runnable`,所以通常不需要自定义。 下面给出示例代码:</think>### Java 8 无返回值无参数的函数式编程 在 Java 8 中,无返回值且无参数的函数式接口可以通过 `Runnable` 接口实现。以下是完整实现方案: #### 1. 基础实现 ```java // 使用 Runnable 接口(无参数,无返回值) Runnable simpleTask = () -> System.out.println("执行无参无返回操作"); simpleTask.run(); // 输出:执行无参无返回操作 // 方法引用形式 Runnable logTask = System.out::println; logTask.run(); // 输出空行(实际调用println()) ``` #### 2. 完整封装示例 ```java import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; public class VoidFunctionDemo { // 定义无参无返回的函数式接口 @FunctionalInterface public interface VoidFunction { void execute(); } public static void main(String[] args) { // 示例1:基本Lambda表达式 VoidFunction task1 = () -> { System.out.println("任务1:清理临时文件"); // 实际清理操作... }; // 示例2:方法引用 VoidFunction task2 = VoidFunctionDemo::databaseBackup; // 执行任务 executeTask(task1); executeTask(task2); // 线程池执行 ExecutorService executor = Executors.newFixedThreadPool(2); executor.submit(() -> task1.execute()); executor.submit(() -> task2.execute()); executor.shutdown(); } // 封装执行方法 private static void executeTask(VoidFunction function) { System.out.println("--- 开始执行 ---"); function.execute(); System.out.println("--- 执行完成 ---\n"); } // 静态方法(符合无参无返回要求) private static void databaseBackup() { System.out.println("任务2:数据库备份中..."); // 备份操作... } } ``` #### 3. 实际应用场景 1. **初始化操作**: ```java VoidFunction init = () -> { loadConfigurations(); initConnectionPool(); }; ``` 2. **定时任务**: ```java ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1); scheduler.scheduleAtFixedRate( () -> System.gc(), // 定期GC 0, 6, TimeUnit.HOURS ); ``` 3. **事件监听**: ```java button.addActionListener(e -> ((VoidFunction)() -> saveFormData()).execute() ); ``` #### 4. 设计注意事项 1. **异常处理**: ```java VoidFunction safeTask = () -> { try { riskyOperation(); } catch (Exception e) { logger.error("操作失败", e); } }; ``` 2. **组合函数**: ```java default VoidFunction andThen(VoidFunction after) { return () -> { this.execute(); after.execute(); }; } // 使用示例 VoidFunction combined = task1.andThen(task2); ``` 3. **空操作**: ```java VoidFunction noop = () -> {}; // 空操作占位符 ``` #### 5. 性能优化建议 1. 避免在热路径中频繁创建Lambda实例 2. 对重复执行的任务使用静态final变量: ```java private static final VoidFunction LOG_ROTATE = () -> rotateLogFiles(); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值