2014-05-23 50 views
0

我有一個對象列表,我想通過滿足特定標準的對象開始迭代子列表。以某個對象開始的子列表

(具體地說,一類聲明的字段的列表,開始字段,例如和 - 例如,通過名字公知的不是由整數索引。)

顯然一個解決辦法是在整個列表進行迭代,在找到特定對象時設置一個標誌,但是我想知道Java 8是否改進了對高階編程的支持,提供了一種更優雅的方式來實現它。

在Java 8中這樣做的最優雅/習慣用法是什麼? (性能不是考慮因素;有問題的代碼將只按程序執行運行一次。)

回答

1

您似乎希望indexOf方法充當謂詞,您可以在其中指定一個自定義屬性以告訴您是否找到滿足它的第一個對象。

它可以使用輔助方法完成。

static <T> List<T> getSubList(List<T> list, Predicate<T> pred){ 
    return list.subList(list.indexOf(list.stream().filter(pred).findFirst().get()), list.size()); 
} 

它所做的是:

  • 得到列表
  • 一個Stream<T>應用過濾器給它
  • 發現滿足給定謂詞
  • 獲取對象的第一個元素在產生的Optional<T>呼叫get()
  • 使用indexOf名單上獲取該對象的
  • 返回原始列表

然後,你可以這樣調用它的sublist指數;

對於一個小例子,這裏的地方它的字符串值以10開始,直到列表的最後,你如何利用從第一對象的子列表。

public class Test { 
    public static void main(String[] args) { 
     List<MyClass> list = new ArrayList<>(); 
     for(int i = 0; i < 15; i++){ 
      list.add(new MyClass(i, String.valueOf(i))); 
     } 
     System.out.println(getSubList(list, o -> o.s.startsWith("10"))); //[MyClass [a=10, b=10], MyClass [a=11, b=11], MyClass [a=12, b=12], MyClass [a=13, b=13], MyClass [a=14, b=14]] 

    } 
    static <T> List<T> getSubList(List<T> list, Predicate<T> pred){ 
     return list.subList(list.indexOf(list.stream().filter(pred).findFirst().get()), list.size()); 
    } 
} 
class MyClass { 
    int i; 
    String s; 
    public MyClass(int i,String s){ 
     this.i = i; 
     this.s = s; 
    } 
    @Override 
    public String toString() { 
     return "MyClass [i=" + i + ", s=" + s + "]"; 
    } 

} 

您可以添加更多的檢查,例如,看看你是否有從Optional(使用isPresent())的值可以通過調用findFirst得到,但你如何做到這一點的主要思想。

希望它能幫助! :)

1

隨着Guava,你可以做

// list is an instance of List<T> from which the sublist is wanted 
Iterable<T> sublist = Iterables.skip(list, list.indexOf(certainObject)); 

然而,這並沒有使用Java的任何新功能8.

1

,你可以:

List<T> list = ...; 
Optional<T> first = list.stream() 
      .filter(f -> f.name.equals("field name")) 
      .findFirst(); 
return first.isPresent() 
      ? list.subList(list.indexOf(first)) 
      : Collections.emptyList(); 

PS:在移動所以不知道它編譯,但總體思路應該工作。

相關問題