2011-05-28 32 views
4

我有一種感覺,如果我知道我想要做什麼的Java術語,Google可以快速回答這個問題,但我不這麼認爲,所以我信任Stack Overflow。 :)如何在Java矢量上使用Ruby風格的地圖?

我有Object個向量,我想的含有向量中的每個元素的字符串表示String秒的陣列,由每個元件上調用toString()作爲生成。

在Ruby(或Perl或Python或方案,或任何其他數百萬語言與map方法),這裏就是我會做它:

vector.map(&:to_s) do |string| 
    # do stuff 
end 

我該怎麼辦了在Java中相當於?我想寫這樣的事情:

Vector<Object> vector = ...; 
String[] strings = vector.map(somethingThatMagicallyCallsToString); 

任何想法?

+2

作爲正交點,這*威力*有用信息:http://stackoverflow.com/questions/1386275/why-java-vector-class-is-考慮過時,或棄用。你最好的選擇是使用'ArrayList'(如果可能的話)。 – Jits 2011-05-28 12:50:23

+0

它也可能取決於你想要的結果。你是否需要它是'String []'或者迭代器是否足夠? – Howard 2011-05-28 12:56:07

+0

@Howard:迭代器應該沒問題。 – 2011-05-28 16:37:53

回答

4

如果您可以帶上Guava,您可以使用它的transform函數。

Iterable<String> strings = Iterables.transform(vector, Functions.toStringFunction()); 

transform的第二個參數是Function界面的一個實例。通常你會寫你自己的這個實現,但番石榴提供toStringFunction()和其他一些。

+0

太棒了!這正是我所追求的。奇怪的是,他們稱之爲'變革'。 ;) – 2011-05-28 16:37:13

+0

@Josh「Map」被重載,具有'java.util.Map'的含義完全不同。我認爲「變形」無論如何都能更好地描述它,但它不是最常見的名稱。 – 2011-05-28 18:45:22

+1

是的,這是一個不幸的命名空間衝突。在Java誕生之前很久,Lisp正在調用列表轉換「map」,所以我個人將這種困惑歸咎於Bill Joy。 ;) – 2011-05-31 04:14:44

2

一種方法可以是:

Vector<Object> vector = ...; 
ArrayList strings = new ArrayList(); 
for (Object obj : vector) { 
    strings.add(obj.toString()); 
} 
return strings.toArray(new String[1]); 
+2

我當然**可以**這樣做,但它比地圖相當笨重。 :) – 2011-05-28 16:39:32

+1

@ josh-glover同意了! – Jits 2011-05-28 17:26:43

+0

笨重但安全,我喜歡它 – 2016-01-12 19:18:08