다음 코드에서 스트림 또는 목록의 마지막 요소를 어떻게 얻을 수 있습니까?
어디 data.careas
A는 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
모든 요소에를 사용하는 것이 포함되며 성능을 저하시킬 수 있으므로 일반적으로 원하지 않을 가능성이 큽니다.
Stream
API는 LINQ
매우 다른 패러다임에서 수행되기 때문에 완전히 비교할 수 없습니다 . 더 나쁘거나 나아진 것이 아니라 단지 다릅니다. 그리고 오라클 개발자가 무능하거나 비열한 것이 아니기 때문에 확실히 일부 방법이 없습니다. :)
Iterables.getLast
Iterable을 사용하지만List
. 애완 동물 비웃음은getFirst
.Stream
일반적으로 API는 편리한 메소드를 많이 생략 끔찍 항문입니다. C #의 LINQ는 constrast에 의해 제공하는 행복.Last()
도하고.Last(Func<T,Boolean> predicate)
, 그것은 무한 Enumerables을 지원하더라도 너무.