[Java] Stream

smiler·2022년 11월 28일
0
post-thumbnail

Sample Data 생성

public class User {
    String user_name;
    String user_id;
    Integer value1;
    Integer value2;
}

// List 사용
List<User> userList = new ArrayList<>();
userList.add(new User("김씨", "Kim", 80, 50));
userList.add(new User("이씨", "Lee", 70, 60));
userList.add(new User("박씨", "Park", 60, 70));

// Stream 사용
Stream<User> userStream = userList.stream();

1. Filter

Stream.filter(변수 -> 조건문)

  • Example 1.
    • CollectionStream으로 변환해야 합니다.
// List 사용
userList.stream()
	.filter(object -> object.user_id.equals("Park") || object.user_id.equals("Lee"))
	.forEach(object -> System.out.println(object.getUser_id()));
    
//Stream 사용
userStream
	.filter(object -> object.user_id.equals("Park") || object.user_id.equals("Lee"))
	.forEach(object -> System.out.println(object.getUser_id()));
Lee
Park

  • Example 2.
    • 두 번 사용하면 AND조건이 됩니다.
userList.stream()
	.filter(object -> object.user_id.equals("Park") || object.user_id.equals("Lee"))
	.filter(object -> object.value1 > 60)
	.forEach(object -> System.out.println(object.getUser_id()));
Lee

  • Example 3.
    • Predicate 인터페이스를 Override해서 조건을 만들 수 있습니다.
userList.stream()
	.filter(new Predicate<User>() {

		@Override
		public boolean test(User user) {
			if(user.user_id.equals("Park") || user.user_id.equals("Lee")) {
				if(user.value1 > 60) return true;
				else return false;
			} else return false;
		}
	})
	.forEach(object -> System.out.println(object.getUser_id()));
Lee


2. Map

Stream.map(변수 -> 대체변수)

  • Example 1.
    • User Stream을 user_name Stream으로 변환합니다.
userList.stream()
	.map(user -> user.getUser_name())
	.forEach(user_name -> System.out.println(user_name));
    
// 람다식 사용    
userList.stream()
	.map(user::getUser_name)
	.forEach(user_name -> System.out.println(user_name));
김씨
이씨
박씨

  • Example 2.
    • Function 인터페이스를 Override 해서 반환조건을 만들 수 있습니다.
    • 아래는 User에서 user_name만 수정해서 반환하는 예제입니다.
userList.stream()
	.map(new Function<User, Object>() {
    
		@Override
		public Object apply(User user) {
			user.setUser_name(user.getUser_name().substring(0, 1));
			return user;
		}
	})
	.forEach(object -> System.out.println(object));
User(user_name=김, user_id=Kim, value1=80, value2=50)
User(user_name=이, user_id=Lee, value1=70, value2=60)
User(user_name=박, user_id=Park, value1=60, value2=70)


3. Sorted

Stream.sorted()

  • Example 1.
    • userListString List로 변환 후 정렬합니다.
userList.stream()
	.map(User::getUser_name)
	.sorted()
	.forEach(getUser_name -> System.out.println(getUser_name));
김씨
박씨
이씨

  • Example 2.
    • Comparator 인터페이스를 Override 해서 정렬조건을 만들 수 있습니다.
    • 아래는 객체를 정렬하는 예제입니다.
userList.stream()
	.sorted(new Comparator<User>() {
    
		@Override
		public int compare(User o1, User o2) {
        	// 내림차순 ( 오름차순은 o1, o2 반대로)
			return o2.getValue2() - o1.getValue2();
		}
	})
	.forEach(object -> System.out.println(object));
User(user_name=박씨, user_id=Park, value1=60, value2=70)
User(user_name=이씨, user_id=Lee, value1=70, value2=60)
User(user_name=김씨, user_id=Kim, value1=80, value2=50)


4. Collect

Stream.collect(Collectors.Collection반환메소드)

  • 결과를 Collection으로 반환해줍니다.

  • Example 1.

    • StreamList로 변환합니다.
List<User> newList = 
	userStream.collect(Collectors.toList());

  • Example 2.
    • StreamMap로 변환합니다.
    • Map의 키가 동일한 경우를 위해 (oldValue, newValue) -> newValue를 사용해줍니다.
Map<Integer, String> newMap = 
	userStream.collect(
    	Collectors.toMap(
        	User::getValue2
            , User::getUser_name
            , (oldValue, newValue) -> newValue)
            );

0개의 댓글