본문 바로가기
Programming/JAVA(eclipse)

java 14 일차 _ 03. 스트림(중간처리)

by yoon9i 2024. 3. 27.

3. 중간처리

  1) 중복제거:  distinct()
  2) 필터링 :  filter(Predicate)
  3) 가공   : map(Function), mapToInt​(ToIntFunction)
            ==> 한개 파라미터 입력되면 한개의 리턴값이 반환

   : flatMap(Function) : Stream
    ==> 한개 파라미터 입력되면 여러개가 하나에 저장되어 반환.
            // 하나의 파라미터로 복수개의 요소들로 구성된 새로운 Stream을 반환한다.
    flatMap​(Function<? super T    ,​   ? extends Stream<? extends R>> mapper)
     예> 입력: "a/b/c"
        리턴: [a,b,c] 형태의 Stream 반환됨.

           : 반환값이 정수라면  flatMapToInt​(Function<? super T,​? extends IntStream> mapper)
 
   4) 정렬 : 
       a. 배열: Arrays.sort(배열);// 오름차순
               Arrays.sort(배열, Comparator);// 내림차순

       b. 컬렉션: Collections.sort(컬렉션, Comparator) // 오름차순,내림차순

       c. Stream: sorted()
                     sorted(Comparator)
                     sorted(Comparator.comparing(t->t.getEng())  // 권장, 기본은 오름차순
                     sorted(Comparator.comparing(t->t.getEng(), Comparator.reverseOrder())  // 내림차순

   5) 갯수 제한 및 skip
       
       - limit(n)
       - skip(n)

  =======> 중간처리는 처리후 거의 대부분이 Stream으로 반환됨.

 

package exam24_스트림;

import java.util.Arrays;
import java.util.List;
import java.util.function.Predicate;

public class StreamTest02_중간처리1_중복제거_필터링 {

	public static void main(String[] args) {
		
		List<String> list = Arrays.asList("홍길동","이순신","유관순","이순신","태조","태종");
		
		// 1. 중복제거
		list.stream()
		    .distinct()
		    .forEach(System.out::println); // 홍길동 이순신 유관순
		System.out.println();
		
		// 2. 필터링: filter(Predicate<? super T> predicate)
		// 첫글자가 "이"로 시작
		Predicate<String> x = new Predicate<String>() {
			@Override
			public boolean test(String t) {
				return t.startsWith("이");
			}			
		};
		
		list.stream().filter(x).forEach(System.out::println);;
		System.out.println();
		
		list.stream()
		.filter(t -> t.startsWith("이"))
		.forEach(System.out::println);
		System.out.println();
		
		// 3. distict() + filter()
		list.stream()
		.distinct()
		.filter(t -> t.startsWith("이"))
		.forEach(System.out::println);
		System.out.println();
		
		
		// 실습: 이름이 2글자만 출력
		list.stream()
		.filter(t -> t.length() == 2).
		forEach(System.out::println);
	}// end main

}
package exam24_스트림;

import java.util.ArrayList;
import java.util.List;
import java.util.function.Function;
import java.util.function.ToIntFunction;

class Student {
	
	String name;
	int kor; // 국어점수
	int eng; // 영어점수
	
	public Student() {}

	public Student(String name, int kor, int eng) {
		this.name = name;
		this.kor = kor;
		this.eng = eng;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public int getKor() {
		return kor;
	}

	public void setKor(int kor) {
		this.kor = kor;
	}

	public int getEng() {
		return eng;
	}

	public void setEng(int eng) {
		this.eng = eng;
	}

	@Override
	public String toString() {
		return "Student [name=" + name + ", kor=" + kor + ", eng=" + eng + "]";
	}
	
	
}// end Student class

public class StreamTest02_중간처리2_가공_map {

	public static void main(String[] args) {
		
		List<Student> list = new ArrayList<>();
		list.add(new Student("홍길동", 100, 80));
		list.add(new Student("이순신", 89, 90));
		list.add(new Student("유관순", 99, 99));
		
		// 1. 이름에서 첫글자만 출력 (성만 출력)-----------------------------------------------
		Function<Student, String> f = new Function<Student, String>() {	
			@Override
			public String apply(Student t) {
				return t.getName().substring(0,1);
			}
		};
		
		list.stream().map(f).forEach(System.out::println);;
		System.out.println();
		
		list.stream().map(t->t.getName().substring(0,1)).forEach(System.out::println);;
		System.out.println();
		
		// 2. eng 점수에 -5 해서 출력------------------------------------------------------
		Function<Student, Integer> f2 = new Function<Student, Integer>() {
			@Override
			public Integer apply(Student t) {
				return t.getEng() - 5;
			}
		};
		
		list.stream().map(f2).forEach(System.out::println);	
		list.stream().map(t -> t.getEng()-5).forEach(System.out::println);	
		System.out.println();
		
		//------
		
		ToIntFunction<Student> f3 = new ToIntFunction<Student>() {
			@Override
			public int applyAsInt(Student t) {
				return t.getEng() - 5;
			}
		};
		
		
		list.stream().mapToInt(f3).forEach(System.out::println);
		list.stream().mapToInt(t->t.getEng()-5).forEach(System.out::println);
		
	}// end main
}
package exam24_스트림;

import java.util.Arrays;
import java.util.List;
import java.util.function.Function;
import java.util.stream.Stream;

public class StreamTest02_중간처리2_가공2_flatMap {

	public static void main(String[] args) {
		
		List<String> list = Arrays.asList("홍길동/홍길동2","이순신/이순신2");
		// " A / A' " 형태라면 / 기준으로 A, A' 나눈다. 
		
		// 하나의 파라미터로 복수개의 요소들로 구성된 새로운 Stream 을 반환한다.
		// flatMap(Function<  ? super T , ? extends Stream<? extends R>  > mapper )
		Function<String, Stream<? extends String>> f = new Function<String, Stream<? extends String>>() {
			@Override
			public Stream<? extends String> apply(String t) {
				String [] names = t.split("/");
				return Arrays.stream(names);
			}
		};
		
		list.stream().flatMap(f).forEach(System.out::println); 
				
	}// end main
}
package exam24_스트림;

import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.function.Function;

class Student2 {
	
	String name;
	int kor; // 국어점수
	int eng; // 영어점수
	
	public Student2() {}

	public Student2(String name, int kor, int eng) {
		this.name = name;
		this.kor = kor;
		this.eng = eng;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public int getKor() {
		return kor;
	}

	public void setKor(int kor) {
		this.kor = kor;
	}

	public int getEng() {
		return eng;
	}

	public void setEng(int eng) {
		this.eng = eng;
	}

	@Override
	public String toString() {
		return "Student [name=" + name + ", kor=" + kor + ", eng=" + eng + "]";
	}
	
	
}// end Student class

public class StreamTest02_중간처리3_정렬_sorted {

	public static void main(String[] args) {
		
		List<Student2> list = new ArrayList<>();
		list.add( new Student2("홍길동", 100,80));
		list.add( new Student2("이순신", 89,90));
		list.add( new Student2("유관순", 99,65));
		list.add( new Student2("유관순", 99,34));
		list.add( new Student2("유관순", 99,100));
		
		// eng 로 정렬
		Comparator<Student2> c = new Comparator<Student2>() {
			@Override
			public int compare(Student2 s1, Student2 s2) {
//				return s1.getEng() - s2.getEng(); // 오름차순
				return s2.getEng() - s1.getEng(); // 내림차순
			}
		};
		list.stream().sorted(c).forEach(System.out::println);
		System.out.println();
		
		// 람다
		Comparator<Student2> c2 = (s1, s2) -> s2.getEng() - s1.getEng();
		list.stream().sorted((s1, s2) -> s2.getEng() - s1.getEng()).forEach(System.out::println);
		System.out.println();
		
		
		
		// 추가: Comparator.comparing(Function)
		Function<Student2, Integer> f = new Function<Student2, Integer>() {	
			@Override
			public Integer apply(Student2 t) {
				return t.getEng();
			}
		};
		
		System.out.println("오름차순");
		list.stream().sorted(Comparator.comparing(f)).forEach(System.out::println);	// 오름차순
		System.out.println();
		
		// 람다 - 오름차순
		list.stream().sorted(Comparator.comparing(t -> t.getEng())).forEach(System.out::println);
		// 람다식 풀어서 확인
		list.stream().sorted(Comparator.comparing((Student2 t) -> t.getEng())).forEach(System.out::println);		
		// 축약
		list.stream().sorted(Comparator.comparing(Student2::getEng)).forEach(System.out::println); // ( * )
		System.out.println();
		
		// 내림차순: .sorted(Comparator.comparing( f, Comparator.reverseOrder() ))
		System.out.println("내림차순");
		list.stream().sorted(Comparator.comparing(f, Comparator.reverseOrder())).forEach(System.out::println);
		
	}// end main
}
package exam24_스트림;

import java.util.ArrayList;
import java.util.List;

class Student3 {
	
	String name;
	int kor; // 국어점수
	int eng; // 영어점수
	
	public Student3() {}

	public Student3(String name, int kor, int eng) {
		this.name = name;
		this.kor = kor;
		this.eng = eng;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public int getKor() {
		return kor;
	}

	public void setKor(int kor) {
		this.kor = kor;
	}

	public int getEng() {
		return eng;
	}

	public void setEng(int eng) {
		this.eng = eng;
	}

	@Override
	public String toString() {
		return "Student [name=" + name + ", kor=" + kor + ", eng=" + eng + "]";
	}
	
	
}// end Student class

public class StreamTest02_중간처리4_limit_skip {

	public static void main(String[] args) {
		
		List<Student3> list = new ArrayList<>();
		list.add( new Student3("홍길동", 100,80));
		list.add( new Student3("이순신", 89,90));
		list.add( new Student3("유관순1", 99,65));
		list.add( new Student3("유관순2", 99,34));
		list.add( new Student3("유관순3", 99,100));
		
		// 3개만 출력
		list.stream().limit(2).forEach(System.out::println);
		System.out.println();
		
		// skip(n)
		list.stream().skip(2).forEach(System.out::println);
		
		
	}// end main
}