1. 스트림(=데이터를 처리하는 파이프라인) 개념 예시
package ex08; import java.util.Arrays; import java.util.List; import java.util.stream.Collectors; public class Test21 { public static void main(String[] args) { List<String> list = Arrays.asList("Kim", "Park", "Lee", "Choi", "Chee"); List<String> sublist = list.stream().filter(s -> s.startsWith("C")).sorted().collect(Collectors.toList()); //이게 바로 파이프 라인 System.out.println(sublist); //결과 출력 } }
* .stream()은 List 객체를 Stream 객체로 변환하는 코드
* 람다 표현식에서 s는 "Kim", "Park", "Lee", "Choi", "Chee"와 같은 리스트의 각 요소다.
* collect(Collectors.toList())를 사용하지 않으면 sublist 변수에 결과를 저장할 수 없다.
스트림은 일회용이기 때문에, 한 번 사용한 스트림은 다시 사용할 수 없다.
따라서 연산을 수행한 후 다시 사용 하려거든
collect
메서드를 호출하여 결과를 저장해야한다.
Stream<String> sublist = list.stream();// 2.스트림 생성 sublist = sublist.filter(s -> s.startsWith("C"));// 3.중간 연산 수행 sublist = sublist.sorted();// 4.중간 연산 수행 List<String> collectedList = sublist.collect(Collectors.toList()); //5.collect 메서드를 호출하여 결과 저장
2. parallelStream(); 란? ㄴㄴ 스레드 써라
일반적인 stream() 메서드와는 달리, parallelStream() 메서드는 병렬 처리를 지원 즉, 멀티 스레드 코드를 쓰지 않고도 여러 개의 코어를 활용하는 코드로 분해함! (내부적으로 스레드 풀을 생성하고 작업을 분할하여 병렬 처리를 수행함)
3. 스트림 연산
1. 생성 단계 : 스트림 객체를 생성하는 단계. 배열이나 컬렉션을 가지고 스트림을 생성할 수 있다. 2. 처리 단계 : 스트림의 요소를 변환하거나 선택적으로 걸러내는 등의 가공하는 작업을 수행 (filter(), map(), sorted() 등) 3. 종말 단계 : 처리된 데이터를 모아서 결과를 만드는 연산 스트림의 요소를 처리하고 최종 결과를 반환하며, 스트림 파이프라인에서 마지막에 위치 (collect(), forEach(), count() 등)
3-1. 생성 단계
[ 배열에서 만들기 ]
String[] arr = { "Kim", "Lee", "Park" }; Stream<String> s2 = Arrays.stream(arr); //애는 이제 Stream타입
[ 컬렉션에서 만들기 ]
List<String> list = Arrays.asList("Kim", "Lee", "Park"); Stream<String> s1 = list.stream();
3-2. filter() 필터링 ★
조건에 맞는 데이터만 통과. 람다식을 인수로 받음 s.contains("P")); → P가 포함된 문자열만 통과
List<String> list = Arrays.asList("Kim", "Lee", "Park"); Stream<String> s1 = list.stream().filter(s -> s.contains("P")); s1.forEach(su -> System.out.println(su));
su는 list 스트림의 요소들 중에서 필터링된 값을 나타냄 (su는 s1
3-3. map() ★
기존의 데이터를 변형하여 새로운 데이터로 생성하는 연산. 람다식을 인수로 받음
List<String> list = Arrays.asList("Kim", "Lee", "Park"); Stream<String> s1 = list.stream().map(s -> s.toUpperCase()); s1.forEach(s -> System.out.println(s));
Stream<String> s1 = list.stream().map(s -> s.toUpperCase());의 s는
각 요소 s를 대문자로 변환하여 반환하는 역할. s는 각 요소를 나타내는 변수명으로 사용되며, 해당 요소를 대문자로 변환하는 역할을 수행함
s1.forEach(s -> System.out.println(s));는 Stream 객체의 각 요소(s1)를
받아와서 출력하는 동작을 수행하는 것 (s=s1)
[ 메소드 참조 버전 ]
Stream<String> s1 = list.stream().map(String::toUpperCase); s1.forEach(s -> System.out.println(s));
3-4. sorted() 정렬 연산
어떤 기준에 따라 정렬하는 연산. 람다식 사용 x 정렬 기준은 Comparator 객체가 된다. (기준이 주어지지 않으면 기본 정렬이 된단 말)
List<String> list = Arrays.asList("Kim", "Lee", "Park"); Stream<String> s1 = list.stream().sorted(Comparator.reverseOrder()); s1.forEach(s -> System.out.println(s));
기본이 오름차순이니, 내림차순으로 정렬하려면 reverseOrder
3-5. reduce() 축소 연산
스트림 요소들을 어떤 함수를 이용하여 결합하여서 하나의 값으로 만들 수 있다. (= 단일 결과값을 생성하는 연산)
package ex08; import java.util.Arrays; import java.util.List; public class Test23 { public static void main(String[] args) { List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8); int sum = numbers.stream().reduce(0, (a, b) -> a + b); System.out.println(sum); } } //값 = 36
sum은 단일 값이므로 forEach() 메소드를 사용할 필요 없이
System.out.println()을 통해 결과값을 출력할 수 있다.
4. 종말 단계
4-1. IntStream - sum(), count()
입력 데이터들을 모아 결과를 생성 (ex. 최대값, 최소값, 합계, 평균값, 개수 등)
package ex08; import java.util.stream.IntStream; public class Test24 { public static void main(String[] args) { int sum = IntStream.of(20, 10, 30, 90, 60).sum(); //모든 요소의 합 long count = IntStream.of(20, 10, 30, 90, 60).count(); //몇개인지 카운트 System.out.println(sum); System.out.println(count); } }
* IntStream.of()는 주어진 정수값들로 구성된 IntStream을 생성하는 메소드
* IntStream 인터페이스는 int 타입의 요소를 처리하는 스트림
4-2. collect() 메소드
스트림 처리의 결과를 컬렉션으로 만들어주는 메소드 어떤 컬렉션으로 만들 것인지는 Collectors 인수로 결정
IntStream.of(20, 10, 30, 90, 60).sorted().collect(Collectors.toList()); 안되는데???
4-3. forEach() 연산
스트림을 지나가는 모든 데이터를 화면에 출력하고 싶을 때
List<String> list = Arrays.asList("Kim", "Lee", "Park"); list.stream().forEach(System.out::println);
[ 잘못된 코드 ]
List<String> list = Arrays.asList("Kim", "Lee", "Park"); Stream<String> s1 = list.stream().forEach(System.out::println); //틀린 예시! 반환값이 없는데 어떻게 s1 변수에 저장을 하나!
[ 맞는 코드 ]
List<String> list4 = Arrays.asList("Kim", "Park", "Lee"); list4.stream().forEach(s -> System.out.print(s + " ")); list4.stream().forEach(System.out::print);
forEach
메소드는 각 요소에 대한 동작을 수행하고 끝나며, 반환값이 없다.
따라서, forEach
메소드의 반환값을 다른 변수에 할당할 수 없다.
forEach가 반환 값이 없어서, s1변수에 저장할 값이 아예 없다.
그냥 출력만 하고 (각 요소에 대한 동작을 수행만 하고) 끝나버린다1. API란?
소프트웨어들이 서로 소통하기 위한 약속 (일종의 다리 역할) 소프트웨어 개발자들이 다른 소프트웨어와 연결하고 상호 작용할 수 있도록 도와주는 중요한 개념 ex) 결제 서비스 API는 외부 응용 프로그램이 결제를 처리하고 결제 정보를 전송할 수 있음. > 국민 앱 결제 시스템으로 무신사 등 외부 인터넷 사이트에서 결제할 수 있게 하는 것!
api (= application interface 메서드의 모임)
Share article