簡體   English   中英

Java等效的C#匿名數組和列表?

[英]Java Equivalent of C# Anonymous Arrays and Lists?

當我需要將它們傳遞給函數時,C#允許我動態創建數組。 假設我有一個名為findMiddleItem(String[] items) 在C#中,我可以編寫如下代碼:

findMiddleItem(new String[] { "one", "two", "three" });

這太棒了,因為這意味着我不必寫:

IList<String> strings = new List<String>();
strings.add("one");
strings.add("two");
strings.add("three");
findMiddleItem(strings.ToArray());

這很糟糕,因為我並不真正關心strings - 它只是一個讓我將字符串數組傳遞給需要它的方法的構造。 一種我無法修改的方法。

那么你如何用Java做到這一點? 我需要知道數組類型(例如String [])以及泛型類型(例如List)。

List和Array是根本不同的東西。

ListCollection類型,是接口的實現。
Array是一種特殊的操作系統特定數據結構,只能通過特殊語法或本機代碼創建。

數組

在Java中,數組語法與您描述的語法相同:

String[] array = new String[] { "one", "two", "three" };

參考: Java教程>數組

清單

創建List的最簡單方法是:

List<String> list = Arrays.asList("one", "two", "three");

但是,結果列表將是不可變的(或者至少它不支持add()remove() ),因此您可以使用ArrayList構造函數調用來包裝調用:

new ArrayList<String>(Arrays.asList("one", "two", "three"));

正如Jon Skeet所說,它與番石榴相比更漂亮,你可以做到:

Lists.newArrayList("one", "two", "three");

參考: Java Tutorial > The List InterfaceLists (guava javadocs)

VARARGS

關於這個評論:

如果我們能夠做findMiddleItem({“one”,“two”,“three”})會很好;

Java varargs為您提供了更好的交易:

public void findMiddleItem(String ... args){
    //
}

你可以使用可變數量的參數調用它:

findMiddleItem("one");
findMiddleItem("one", "two");
findMiddleItem("one", "two", "three");

或者使用數組:

findMiddleItem(new String[]{"one", "two", "three"});

參考: Java Tutorial > Arbitrary Number of Arguments

你可以用完全相同的方式做到:

findMiddleItem(new String[] { "one", "two", "three" });

在Java中有效。 假設findMiddleItem定義為:

findMiddleItem(String[] array)

在Java中,您可以以相同的方式構造數組:

findMiddleItem(new String[] { "one", "two", "three" });

你不能以完全相同的方式構造List<T> ,但是有各種方法可以解決這個問題,例如包裝數組或使用一些Guava Lists.*方法。 (您嘗試使用IList<string>類型的參數調用findMiddleItem代碼將不會編譯,因為IList<string>不一定是string[] 。)例如,如果findMiddleItem實際上具有List<String>類型的參數您可以使用List<String>

findMiddleItem(Lists.newArrayList("one", "two", "three"));

除了沒有集合初始化器(或對象初始化器)之外,Java 沒有隱式類型化的數組......您的原始C#代碼可以在C#3及更高版本中壓縮:

findMiddleItem(new[] { "one", "two", "three" });

與C# findMiddleItem(new String[] { "one", "two", "three" }) ;

此外,為了將來參考,您可以用稍微冗長的方式在Java中構建List *

List<String> myStringList = new ArrayList<String>() {{
   add("a");
   add("b");
   add("c");
}};

*正如Sean所指出的,這可以被認為是不好的做法,因為它確實創建了一個ArrayList的匿名子類。

我認為這是Java中完全相同的語法。 這有效:

public class Main
{
    public static void main( String[] args )
    {
        method1( new String[] {"this", "is", "a", "test"} );
    }


    private static void method1( String[] params )
    {
        for( String string : params )
            System.out.println( string );
    }
}

我認為這也適用於非靜態方法。

除了使用vargs之外

findMiddleItem("one", "two", "three", "four", "five");

你可以做

findMiddleItem("one,two,three,four,five".split(","));

編輯:要將String轉換為List,您可以使用輔助方法。

public static List<String> list(String text) {
    return Arrays.asList(text.split(","));
}

findMiddleItem(list("one,two,three,four,five"));

暫無
暫無

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

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