2012-04-05 40 views
4

當給出了兩個Iterables結合使用標準庫中有兩個Iterables - 或 - 圖多Iterables

val keys = newLinkedList('foo', 'bar', 'bla') 
val vals = newLinkedList(42, 43, 44) 

我想每個項目在這樣兩個列表關聯:

val Iterable<Pair<String, Integer>> expected 
    = newLinkedList('foo'->42, 'bar'->43, 'bla'->44) 

OK,我可以通過手動迭代這兩個列表來完成。

在另一方面,這種氣味像一些地方

  • 一些標準功能提供的Xtend或番石榴或
  • 一些巧妙的技巧將做它在一行。

對於Python中的例子來說,這將是一件簡單的事情,因爲它們的map函數可以帶多個列表。

這怎麼能用最小代碼使用Xtend2 +來解決?

+0

http://code.google.com/p/guava-libraries/wiki/IdeaGraveyard討論爲什麼番石榴不提供Pair類型。 – 2012-04-05 23:52:32

+1

我認爲這種代碼在寫入命令式風格時實際上更具可讀性。 「過量使用番石榴的函數式編程語言會導致冗長,混亂,不可讀和低效率的代碼,這些是番石榴最容易(也是最常見)被濫用的部分,而且當你走向荒謬的長度時讓你的代碼「一行代碼」,Guava團隊流淚。「*(http://code.google.com/p/guava-libraries/wiki/FunctionalExplained) – 2012-04-06 08:18:38

+0

@LouisWasserman:請注意,問題基本上是關於Xtend,一種功能性語言,內部使用番石榴。 IN Xtend you _have_'Pair'嵌入到語言中。這就是'x-> y'操作符所做的。所以我認爲番石榴的哲學不適用於這種情況。 – 2012-04-06 09:09:59

回答

7
final Iterator it = vals.iterator(); 
expected = Iterables.transform(keys, new Function<String, Pair>() { 
    public Pair apply(String key) { 
     return new Pair(key, it.next()); 
    } 
}); 

添加人AH:

在此的Xtend看起來是這樣的:

val valsIter = vals.iterator() 
val paired = keys.map[ k | k -> valsIter.next ] 
相關問題