当我需要将它们传递给函数时,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)。
答案 0 :(得分:18)
列表和数组是根本不同的东西。
List
是Collection
类型,是接口的实现
Array是一种特殊的操作系统特定数据结构,只能通过特殊语法或本机代码创建。
在Java中,数组语法与您描述的语法相同:
String[] array = new String[] { "one", "two", "three" };
创建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 Interface
,Lists
(guava javadocs)
关于此评论:
Java varargs为您提供了更好的交易:如果我们能够做findMiddleItem({“one”,“two”,“three”})会很好;
public void findMiddleItem(String ... args){
//
}
你可以使用可变数量的参数调用它:
findMiddleItem("one");
findMiddleItem("one", "two");
findMiddleItem("one", "two", "three");
或者使用数组:
findMiddleItem(new String[]{"one", "two", "three"});
答案 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"));