Java8 Stream:满足条件后收集元素

我的POJO如下

class EventUser { private id; private userId; private eventId; } 

我按如下方式检索EventUser对象:

 List eventUsers = eventUserRepository.findByUserId(userId); 

说’eventUsers’如下:

 [ {"id":"id200","userId":"001","eventId":"1010"}, {"id":"id101","userId":"001","eventId":"4212"}, {"id":"id402","userId":"001","eventId":"1221"}, {"id":"id301","userId":"001","eventId":"2423"}, {"id":"id701","userId":"001","eventId":"5423"}, {"id":"id601","userId":"001","eventId":"7423"} ] 

使用流式传输,而不使用任何中间变量,如何在给定的EventUser.id之后过滤和收集事件:ex:

 List filteredByOffSet = eventUsers.stream.SOMEFILTER_AND_COLLECT("id301"); 

结果应该是:

 [{"id":"id301","userId":"001","eventId":"2423"}, {"id":"id701","userId":"001","eventId":"5423"}, {"id":"id601","userId":"001","eventId":"7423"}] 

在Java 8中,您需要一个有状态的filter

 public static  Predicate from(Predicate test) { boolean[] found = { false }; // once found, always true return t -> found[0] || (found[0] = test.test(t)); } 

注意:这仅对单线程流有意义。

 List filteredByOffSet = eventUsers.stream() .filter(from(e -> "id301".equals(e.getId())) .collect(Collectors.toList()); 

使用Java 9中的“ dropWhile ”。

首先查找搜索项的索引:

 int asInt = IntStream.range(0, list.size()) .filter(userInd-> list.get(userInd).equals()) .findFirst() .getAsInt(); 

获取索引上和之后的项目:

 list.stream().skip(asInt).collect(Collectors.toList()); 

你不能在不使用任何中间变量的情况下这样做。 找到位置并将其迭代到最后(请参阅下面的问题,更准确地回答) 在此处输入链接描述