[Java] stream

 자바에서 배열 혹은 컬렉션 인스턴스의 조회를 위해서 흔히 for문 또는 foreach(iter)문을 사용하면서 요소 하나씩을 꺼내서 조회하였다. 간단한 경우에는 크게 문제되지 않지만, block으로 관리되는 특성상 로직이 복잡해지면 코드가 복잡해지는 문제가 있다. 

자바 api 문서를 보면 스트림은 'A sequence of elements supporting sequential and parallel aggregate operations'라고 나와있다. 즉 배열이나 컬렉션과 같이 데이터를 나란히 저장하는 자료구조에서 원하는 결과를 필터링해서 얻어낼 수 있는 방법이다. 스트림을 사용하기 위해서는 크게 생성-필터링의 가공을 거쳐 결과를 사용하게 된다.

 

 

1. 생성

 배열과 컬렉션 등의 다양한 자료구조에서 스트림을 생성하여 사용할 수 있다.

String[] arr = new String[]{"a","b","c"};
Stream<String> stream = Arrays.stream(arr);
Stream<String> stream = Arrays.stream(arr, 1, 3); //idx 1<=x<3
List<String> list = Arrays.asList("a", "b", "c");
Stream<String> stream = list.stream();

배열과 컬렉션 뿐 아니라 직접 Stream객체에 <>builder().build()를 이용해서 직접 원하는 값을 넣을 수도 있다.

Stream<String> builder = Stream.<String>builder()
        .add("a")
        .add("b")
        .add("c")
        .build();

 

 

2. 필터링

 모종의 방법으로 스트림 객체를 만들었다면, 사용자가 원하는 데이터를 뽑아내기 위해서 필터링을 거친다.

List<Integer> list = new ArrayList<>();
list.add(3);
list.add(5);
list.add(4);

int rst = list.stream().filter(m->m==4)
        .findFirst()
        .orElse(-1);
public Optional<Member> findByLoginId(String loginId) {

    return findAll().stream()
            .filter(m->m.getLoginId().equals(loginId))
            .findFirst();
            
//        return findAll().stream()
//                .filter(new Predicate<Member>() {
//                    @Override
//                    public boolean test(Member member) {
//                        return member.getLoginId().equals(loginId);
//                    }
//                })
//                .findFirst();

}

첫 예제에서는 Integer형으로 리스트를 만든 후에, 그 리스트를 사용하여 스트림을 만들었는데, m이 4인 경우 처음 나오는 수를 반환하게 하였다. 이때 orElse를 붙인 이유는 findFirst()의 결과가 Optional<>타입이기 때문에 null일 경우 -1을 반환해주도록 하기 위해서이다.

 

두번째 예제도 비슷하게 findAll()함수로 리턴된 ArrayList를 stream으로 만들고 필터를 이용하여 인자로 들어온 loginId와 동일한 아이디를 반환한다. 이때 findFirst()라는 함수에 의해서 첫번째로 찾은 결과를 Optional객체로 반환하게 된다.

람다를 사용하지 않는다면 boolean을 반환하는 Predicate 인터페이스의 test 메소드를 오버라이딩해주어야 하는데, 그냥 람다 쓰자.

 

 

나중에 할것

- 람다 정리

- optional 정리