Java等效的C#匿名数组和列表?

时间:2011-01-20 17:18:12

标签: c# java arrays collections

当我需要将它们传递给函数时,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)。

6 个答案:

答案 0 :(得分:18)

列表和数组是根本不同的东西。

ListCollection类型,是接口的实现 Array是一种特殊的操作系统特定数据结构,只能通过特殊语法或本机代码创建。

阵列

在Java中,数组语法与您描述的语法相同:

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

参考: Java tutorial > Arrays

解释

创建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

答案 1 :(得分:3)

您可以采用完全相同的方式:

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

在Java中有效。假设findMiddleItem被定义为:

findMiddleItem(String[] array)

答案 2 :(得分:3)

在Java中,您可以用相同的方式构建数组:

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

您无法以完全相同的方式构建List<T>,但有各种方法可以解决这个问题,例如包装数组,或使用某些Guava Lists.*方法。 (尝试使用findMiddleItem类型的参数调用IList<string>的代码不会编译,因为IList<string>不一定是string[]。)例如,如果findMiddleItem实际上有一个可以使用的List<String>类型的参数:

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

除了没有集合初始值设定项(或对象初始值设定项)之外,Java 没有隐式类型的数组......您的原始C#代码可以在C#3及更高版本中压缩:

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

答案 3 :(得分:1)

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

中的方式相同

此外,为了将来参考,您可以用稍微冗长的方式构建一个Java列表 *

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

* 正如Sean所指出的,这可以被认为是不好的做法,因为它确实创建了ArrayList的匿名子类。

答案 4 :(得分:1)

我认为这与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 );
    }
}

我认为这也适用于非静态方法。

答案 5 :(得分:0)

除了使用像

这样的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"));