我有一個對象列表,我想通過滿足特定標準的對象開始迭代子列表。以某個對象開始的子列表
(具體地說,一類聲明的字段的列表,開始字段,例如和 - 例如,通過名字公知的不是由整數索引。)
顯然一個解決辦法是在整個列表進行迭代,在找到特定對象時設置一個標誌,但是我想知道Java 8是否改進了對高階編程的支持,提供了一種更優雅的方式來實現它。
在Java 8中這樣做的最優雅/習慣用法是什麼? (性能不是考慮因素;有問題的代碼將只按程序執行運行一次。)
我有一個對象列表,我想通過滿足特定標準的對象開始迭代子列表。以某個對象開始的子列表
(具體地說,一類聲明的字段的列表,開始字段,例如和 - 例如,通過名字公知的不是由整數索引。)
顯然一個解決辦法是在整個列表進行迭代,在找到特定對象時設置一個標誌,但是我想知道Java 8是否改進了對高階編程的支持,提供了一種更優雅的方式來實現它。
在Java 8中這樣做的最優雅/習慣用法是什麼? (性能不是考慮因素;有問題的代碼將只按程序執行運行一次。)
您似乎希望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
得到,但你如何做到這一點的主要思想。
希望它能幫助! :)
隨着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.
,你可以:
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:在移動所以不知道它編譯,但總體思路應該工作。