簡體   English   中英

如何將數組傳遞給函數而不是 Java 中的值

[英]How to pass an array to a function instead of the values in it in Java

我有一個接受四個雙打的函數,我有一個包含四個雙打的數組。 有什么辦法可以將數組傳遞給函數嗎? 例如:

double[] myArray = {1.0, 2.0, 3.0, 4.0};

function myFunc(double val1, double val2, double, val3, double val4) {
    //do something with the values
}

myFunc(myArray[0], myArray[1], myArray[2], myArray[3]); // Do I have to do this?

myFunc(myArray); // Or can I do something like this?

謝謝!

編輯:當我說myFunc(myArray)我的意思是“Java 是否內置了任何格式來允許我執行與此相同的操作?” 抱歉我不清楚:(

myFunc(myArray[0], myArray[1], myArray[2], myArray[3]); // Do I have to do this?

不,但你會希望你做到了。

這是使用反射的非擴展盒裝類型的簡化示例。 如果你還想支持原始類型,你可以為每個這樣的類型添加一個call覆蓋:

import java.util.*;
import java.lang.reflect.*;

class Test extends ArrayCallable {
  void myFunc(Double val1, Double val2, Double val3, Double val4) {
    System.out.println("myFunc is running");
  }

  public static void main(String[] args) throws Exception {
    Double[] myArray = {1.0, 2.0, 3.0, 4.0};
    new Test().call("myFunc", myArray);
  }
}

class ArrayCallable {
  void call(String name, Object[] params) throws Exception {
    Class[] types = Arrays.stream(params).map(c -> c.getClass()).toArray(Class[]::new);
    Method m = getClass().getDeclaredMethod(name, types);
    m.invoke(this, params);
  }
}

這比你的方式慢得多,而且更容易出錯,但它確實允許你做你想做的事。

為什么 Java 使這變得困難?

這是一個概念上有問題的操作。 您正在嘗試將動態分派應用於具有靜態分派的靜態類型語言。 不能再依賴正常的編譯器和類加載檢查。 系統無法高效地分派或 JIT,程序員必須在運行時處理更多的輸入錯誤。

很容易做到這一點的語言(如 Lisp 或 JavaScript)通常缺乏方法重載,並且無論如何都將參數作為列表傳遞,因此不會受到太多影響。

我應該怎么做?

如果您想允許使用一系列雙精度數或數組調用myFunc ,您應該將其設為可變參數。

對於調用myFunc的程序員來說,這感覺是一樣的,但通過允許 Java 進行靜態分派並允許myFunc的實現者決定如何處理可變數量的參數,使生活更輕松。

您可以將函數的參數更改為:

function myFunc(double[] array) {
    //do something with the values
}

現在您將能夠將整個數組傳遞給函數

myFunc(myArray);

double[] myArray = {1.0, 2.0, 3.0, 4.0};

您可以將對象 - myArray 傳遞給您的方法,然后使用索引讀取存儲在數組中的各個值:

public void someFunction(double[] myArray){
  double val1 = myArray[0];
  double val2 = myArray[1];    
}

並確保在 main 方法中調用該函數:

public static void main(String[] args){
    double[] myArray = {1.0, 2.0, 3.0, 4.0};
    someFunction(myArray);  
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM