假设我有一个自定义对象的列表,MaDate
其字段temp
类型为int
。我想在第一个达到特定阈值后使用流来获取所有项目MaDate.temp >= 10
。
class MaDate {
int temp;
// some other fields
MaDate(int temp){
this.temp = temp;
}
int getTemp(){
return temp;
}
}
和
List<MaDate> myList = new ArrayList<>();
myList.add(new MaDate(3));
myList.add(new MaDate(7));
myList.add(new MaDate(8));
myList.add(new MaDate(4));
myList.add(new MaDate(10));
myList.add(new MaDate(3));
myList.add(new MaDate(9));
理想情况下,结果列表应包含具有temp
值[10,3,9] 的最后3个元素。
我不能使用 filter
myList.stream().filter(m -> m.getTemp() >= 10)...
因为这将消除值小于10的每个对象。我也不能使用 skip
myList.stream().skip(4)...
因为我事先不知道索引。我不能使用
findFirst(m -> m.getTemp() >= 10)
因为一旦触及阈值后,我需要所有对象,之后对象将拥有哪些值。
我可以将上述内容以某种方式结合起来以获得我想要的内容,或者编写自己的方法放入skip
或filter
myList.stream().skip(**as long as treshold not met**)
要么
myList.stream().filter(**all elements after first element value above 10**)
?
如果我正确理解您的问题,则可以使用Stream#dropWhile(Predicate)
:
如果删除此流,则返回在删除与给定谓词匹配的元素的最长前缀之后,由该流的其余元素组成的流。否则,如果此流是无序的,则返回在删除与给定谓词匹配的元素子集之后由该流的其余元素组成的流。
例:
List<MaDate> originalList = ...;
List<MaDate> newList = originalList.stream()
.dropWhile(m -> m.getTemp() < 10)
.collect(Collectors.toList());
请注意,它dropWhile
是Java 9中添加的。如果使用Java 8,此问答将显示一种解决方法:通过谓词限制流。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句