在对象属性超过特定阈值后收集流

Collect a stream after an objects attribute exceeds a certain threshold

假设我有一个自定义对象列表 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)

因为在达到阈值后我需要所有对象,而不管对象之后的值是什么。

我能否以某种方式组合以上内容以获得我想要的内容或编写我自己的方法以放入 skipfilter

 myList.stream().skip(**as long as treshold not met**)

 myList.stream().filter(**all elements after first element value above 10**)

?

如果我正确理解你的问题,那么你可以使用 Stream#dropWhile(Predicate):

Returns, if this stream is ordered, a stream consisting of the remaining elements of this stream after dropping the longest prefix of elements that match the given predicate. Otherwise returns, if this stream is unordered, a stream consisting of the remaining elements of this stream after dropping a subset of elements that match the given predicate.

示例:

List<MaDate> originalList = ...;
List<MaDate> newList = originalList.stream()
        .dropWhile(m -> m.getTemp() < 10)
        .collect(Collectors.toList());

请注意 dropWhile 已添加到 Java 9 中。如果您使用 Java 8,此问答显示了一个解决方法:Limit a stream by a predicate.