언어

[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을 적어보았습니다.

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

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