-
[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을 적어보았습니다.
이것 이외에 훠~~~~얼신 더 많습니다. 제가모르는 유용한 것들도 엄청 많을거에요.
실무에서 많이 사용하시는 것들 있으면 댓글에 남겨주세요. 저도 공부하고 다음에 포스팅 할께요 :)