다음 코드에서 스트림 또는 목록의 마지막 요소를 어떻게 얻을 수 있습니까?
어디 data.careasA는 List<CArea>:
CArea first = data.careas.stream()
.filter(c -> c.bbox.orientationHorizontal).findFirst().get();
CArea last = data.careas.stream()
.filter(c -> c.bbox.orientationHorizontal)
.collect(Collectors.toList()).; //how to?
보시다시피 첫 번째 요소를 얻는 filter것은 어렵지 않습니다.
그러나 한 줄의 마지막 요소를 얻는 것은 진정한 고통입니다.
- 에서 직접 얻을 수없는 것 같습니다
Stream. (유한 스트림에서만 의미가 있습니다) - 또한 당신 같은 것들을 얻을 수없는 것 같습니다
first()과last()로부터List정말 고통 인터페이스를.
인터페이스의 요소가 정렬되어 있고 크기가 더 알려져 있기 때문에 인터페이스 에서 first()및 last()메서드를 제공하지 않는다는 주장은 보이지 않습니다 List.
그러나 원래 답변에 따르면 유한의 마지막 요소를 얻는 방법은 Stream무엇입니까?
개인적으로 이것은 내가 얻을 수있는 가장 가까운 것입니다.
int lastIndex = data.careas.stream()
.filter(c -> c.bbox.orientationHorizontal)
.mapToInt(c -> data.careas.indexOf(c)).max().getAsInt();
CArea last = data.careas.get(lastIndex);
그러나 indexOf모든 요소에를 사용하는 것이 포함되며 성능을 저하시킬 수 있으므로 일반적으로 원하지 않을 가능성이 큽니다.
StreamAPI는 LINQ매우 다른 패러다임에서 수행되기 때문에 완전히 비교할 수 없습니다 . 더 나쁘거나 나아진 것이 아니라 단지 다릅니다. 그리고 오라클 개발자가 무능하거나 비열한 것이 아니기 때문에 확실히 일부 방법이 없습니다. :)
Iterables.getLastIterable을 사용하지만List. 애완 동물 비웃음은getFirst.Stream일반적으로 API는 편리한 메소드를 많이 생략 끔찍 항문입니다. C #의 LINQ는 constrast에 의해 제공하는 행복.Last()도하고.Last(Func<T,Boolean> predicate), 그것은 무한 Enumerables을 지원하더라도 너무.