2017-01-30 68 views
9

我試圖從番石榴遷移到Java 8 Streams,但無法弄清楚如何處理iterables。這裏是我的代碼,從迭代中刪除空字符串:如何用Streams替換Iterables.filter()?

Iterable<String> list = Iterables.filter(
    raw, // it's Iterable<String> 
    new Predicate<String>() { 
    @Override 
    public boolean apply(String text) { 
     return !text.isEmpty(); 
    } 
    } 
); 

注意的是,這是一個Iterable,而不是Collection。它可能包含一個無限的項目數量,我無法將其全部加載到內存中。我的Java 8選擇是什麼?

BTW,與蘭巴這段代碼看起來更短:

Iterable<String> list = Iterables.filter(
    raw, item -> !item.isEmpty() 
); 
+0

是什麼類型'raw'? – shmosel

+0

你上哪個版本的番石榴?或者你根本不想使用番石榴? – shmosel

+0

@shmosel我想擺脫Guava並遷移到Java 8 Streams,如果可能的話。也許不是。這就是爲什麼在這裏問。 – yegor256

回答

8

可以實現Iterable作爲使用Stream.iterator()功能接口:

Iterable<String> list =() -> StreamSupport.stream(raw.spliterator(), false) 
     .filter(text -> !text.isEmpty()) 
     .iterator(); 
+0

'iterator()'返回'Iterator'的實例,而不是'Iterable' – yegor256

+1

@ yegor256請仔細閱讀。或者試試看。 – shmosel

+1

明白了,我的不好。謝謝! – yegor256