2011-05-30 74 views
6

假設您想要構建一個對象的副本,但會過濾掉一些原始條目。實現的一個方法如下:Google Collections(Guava Libraries):ImmutableSet/List/Map and Filtering

ImmutableList.copyOf(Iterables.filter(myObject, myObject.EQUALS)); 

其中myObject.EQUALS是爲Iterables.filter()操作的謂詞。我認爲這是一個非常優雅和易於閱讀的實現。然而,一個建立兩個列表對象(首先通過Iterables.filter(...)調用,第二個通過ImmutableList.copyOf(...)),這非常低效。

有人知道更有效的方法嗎?

我想最好的辦法是將過濾器謂詞添加到構建器中,以便該對象只能構建一次。但不幸的是,沒有這樣的參數。

+1

也許你可以使用Predicates.equalTo()而不是實現它:) – 2011-06-09 14:50:57

+0

謝謝你的提示;-) – danbim 2011-06-27 12:43:02

回答

0

看番石榴的Iterators

具體過濾器(Iterator未過濾,謂詞謂詞)

+1

嗯,這是用'Iterables內部.filter()':-) – 2011-05-30 14:17:40

+0

是的。你是對的。只是看着它。如果有疑問,我總是使用迭代器,但很好知道(視圖)。 – 2011-05-30 15:19:16

16

Iterables.filter()結果是myObject只是一個視圖通過數據:新列表由ImmutableList.copyOf()使用濾波只建迭代器提供的Iterable

+6

+1:這是鮮爲人知的,經常被忽視:'filter()'不會**創建​​副本(具有所有相關的優點和缺點),它只是一個視圖。 – 2011-05-30 13:41:56

+1

這是Iterables.transform() – 2011-06-09 14:51:42

+0

太棒了!感謝您的信息! – danbim 2011-06-27 12:48:46