ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Java8] 자바 Stream 정리
    언어 2019. 4. 13. 17:45

    이번 글에서는 자바 stream에 대해서 알아보겠습니다.

    제가 자주 사용하는 stream을 정리 할꺼에요~ 

     

     

    stream 이란 ? 

    자바 8에서 추가가 되었고 람다를 활용할 수 있는 기술중에 하나입니다. 자바 8 이전에는 배열이나 컬렉션등을 다룰 때 for 또는 forEach를 많이 사용했는데 이 경우는 코드의 양이 많아진 단점이 있었습니다.

    하지만 스트림을 사용하면 한줄로 모든걸 할 수 있다는 장점이 있어요  

    스트림은 데이터의 흐름으로써 배열이나 컬렉션을 매핑하고 필터링하며 가공된 결과를 얻을 수 있습니다.

    아래에 있는 코드들을 보시면 이해가 잘 되실 수 있을꺼에요 

     

     

    우선 User class로 이루어진 배열을 만들거에요,

    만들기 전에 name과 num을 가지고 있는 User class 를 생성합니다.

    public class User {
    
        private String name;
        private int num;
    
        public User(String name, int num){
            this.name = name;
            this.num = num;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public int getNum() {
            return num;
        }
    
        public void setNum(int num) {
            this.num = num;
        }
    
        @Override
        public String toString() {
            return "User{" +
                    "name='" + name + '\'' +
                    ", num=" + num +
                    '}';
        }
    }
    
    

     

    List 에 아래와 같이 추가해줍니다. 

            List<User> users = Arrays.asList(
                    new User("yoo",1),
                    new User("david",2),
                    new User("ko",3),
                    new User("john",4),
                    new User("rose",5),
                    new User("cate",6),
                    new User("jenny",7));
    

     

    Mapping

    특정 value만 뽑고 싶을 때 사용합니다.

    User class에 name과 num이 있으니, name만 뽑고싶을 때 아래와 같이 하면 됩니다.

    List<String> userName = users.stream().map(User::getName).collect(Collectors.toList());
    System.out.println(userName); // [yoo, david, ko, john, rose, cate, jenny]

     

    Filtering

    name에서 "o" 가 들어가는 이름들만 뽑고싶을때는 filter를 사용하시면 됩니다.

    List<String> filteringUser = users.stream().map(User::getName).filter(n -> n.contains("o")).collect(Collectors.toList());
    System.out.println(filteringUser); // [yoo, ko, john, rose]

     

    num이 4 초과인것만 뽑고 싶을 때는 ? 

    List<User> filteringUser = users.stream().filter(user -> user.getNum() > 4).collect(Collectors.toList());
    System.out.println(filteringUser); //[User{name='rose', num=5}, User{name='cate', num=6}, User{name='jenny', num=7}]

     

    Matching

    하나라도 조건을 만족하는 요소가 있는지(anyMatch)

    모두 조건을 만족하는지(allMatch)

    모두 조건을 만족하지 않는지(noneMatch)

    Boolean anyMatch = users.stream().anyMatch(user -> user.getName().contains("a"));
    System.out.println(anyMatch); //true
    
    Boolean allMatch = users.stream().allMatch(user -> user.getName().contains("a"));
    System.out.println(allMatch); //false
    
    Boolean noneMatch = users.stream().noneMatch(user -> user.getName().contains("a"));
    System.out.println(noneMatch); //false

     

     

    이렇게 제가 자주 사용하는 stream을 적어보았습니다.

    이것 이외에 훠~~~~얼신 더 많습니다. 제가모르는 유용한 것들도 엄청 많을거에요.

    실무에서 많이 사용하시는 것들 있으면 댓글에 남겨주세요. 저도 공부하고 다음에 포스팅 할께요 :)

     

Designed by Tistory.