[Java] Java8 Stream 컬렉션의 가장 앞 요소, 가장 뒤 요소 찾기 :: findFirst, findLast(reduce), findAny

동민·2022년 3월 22일
0

Data.java

@Getter
@Builder
class Data {
    private final String no;
    private final String data;
}
list(Data): [{"1", "동동"}, {"2", "은동"}, {"1", "포동"}, {"4", "규동"}, {"1", "우동"}]

객체와 List가 위와 같을 때,

1. findFirst

String result1 = Optional.of(list)
                .orElse(Collections.emptyList())
                .stream()
                .filter(l -> StringUtils.equals("1", l.getNo()))
                .findFirst()
                .map(Data::getData)
                .orElse(null);
  • 컬렉션의 가장 앞 요소를 꺼낸다.
    필터 된 리스트 {"1", "동동"}, {"1", "포동"}, {"1", "우동"}
    {"1", "동동"} 출력

2. findAny

String result2 = Optional.of(list)
                .orElse(Collections.emptyList())
                .stream()
                .filter(l -> StringUtils.equals("1", l.getNo()))
                .findAny()
                .map(Data::getData)
                .orElse(null);
  • Multi thread에서 Stream을 처리할 때 가장 먼저 찾은 요소를 리턴한다.
    (직렬 처리일 때는 findFirst 와 동일)

3. findLast (reduce)

String result3 = Optional.of(list)
                .orElse(Collections.emptyList())
                .stream()
                .filter(l -> StringUtils.equals("1", l.getNo()))
                .reduce((first, second) -> second)
                .map(Data::getData)
                .orElse(null);
  • 컬렉션의 가장 뒤 요소를 꺼낸다.
    필터 된 리스트 {"1", "동동"}, {"1", "포동"}, {"1", "우동"}
    {"1", "우동"} 출력
profile
BE Developer

0개의 댓글