[Java] 자바 #47, 스트림의 개념 및 예제
- 프로그래밍 언어/Java
- 2019. 3. 17. 20:15
람다식을 배운 목적
1. 익명객체를 쉽게 만들기 위해서
- 배열(컬렉션)
2. 스트림을 사용하기 위해
스트림(Stream)
- JDK 1.8에서 추가
- 배열(컬렉션)을 탐색하기 위한 도구.
- 람다식으로 구성된 도구.(적은 코드로 작성하기 편함)
- Iterator 작업을 대신하는 경우가 많음
- 내부 반복자
탐색하는 방법
1. for
2. for each
3. iterator
4. stream (현재 할것)
스트림 기본 예제
List<String> list = new ArrayList<String>();
list.add("볼펜");
list.add("지우개");
list.add("샤프");
list.add("형광펜");
list.add("커터칼");
다음과 같은 List가 있을 때, list의 내용물을 하나씩 출력하고 싶다면...?
1. Iterator 사용하는 경우
Iterator<String> iter = list.iterator();
while(iter.hasNext()) {
System.out.println(iter.next());
}
2. stream을 사용하는 경우(람다식 포함)
Stream<String> stream = list.stream();
stream.forEach(s -> System.out.println(s));
스트림 기본 예제2
String array[] = {"홍길동","아무개","하하하","호호호","히히히"};
Stream<String> stream2 = Arrays.stream(array);
forEach() : 집합에서 요소를 1개씩 꺼내어 Consumer에게 전달.. accept() 메소드 호출
stream2.forEach(name -> System.out.println(name));
stream2.close();
stream2=Arrays.stream(array);
stream2.forEach(name ->{ 이 괄호는 accept 메소드의 구현부
System.out.println("이름 : "+name);
System.out.println("이름의 길이 : "+name.length());
System.out.println("성 : "+name.substring(0, 1));
});
스트림 정렬 예제
List<String> list = new ArrayList<String>();
list.add("볼펜");
list.add("지우개");
list.add("샤프");
list.add("형광펜");
list.add("커터칼");
위와 같은 List가 있을 때!
정렬 후 출력 예제
1. 라이브러리를 이용한 정렬
Collection.sort(list); -> list 컬렉션 자체를 바꿔놓음. >> 이건 가나다순 정렬
2. List 인터페이스에 있는 sort() 메소드를 이용한 정렬(람다식 포함) >> 이건 길이순서, 가나다순대로 정렬.
list.sort((s1,s2) -> s1.length() - s2.length());
3. stream을 이용한 정렬
Stream<String> stream = list.stream();
stream.sorted((s1,s2)->s2.length()-s1.length()).forEach(s -> System.out.println(s));
정렬조건 지정 반복
==> list.stream().sorted((s1, s2) -> s2.length() - s1.length()).forEach(item -> System.out.println(item));
스트림 필터링 예제
필터링
- 대부분의 스트림이 지원
- filter() : 조건을 만족하는 요소만 스트림으로 반환.(모든요소를 대상으로하는 조건문 역할)
- distinct(): 중복값 제거 후 스트림으로 변환(요소들 중 같은 값을 가지는 요소가 있으면 그중 하나만 남기고 나머지는 제거)
다음과 같이 List가 있을 때
List<Integer> nums = Arrays.asList(10,20,41,54,32,85,57,54,34,84,10,20,20,10);
1. distinct() 중복값 제거
nums.stream().distinct().forEach(num -> System.out.println(num)); 중복된 54와 10과 20을 제거한 값들만 나옴.
2. filter() 조건
nums.stream().filter(num-> num%20==0).forEach(num->System.out.println(num)); 20의 배수인 것이라는 조건으로 필터
위와 같은 List를 만들고.
List<String> names = Arrays.asList("홍길동","홍가가","홍나나","홍길순","유재석","박명수","정형돈","남궁양석","홍길동","홍길순");
names.stream().filter(name-> name.length()>=3).filter(name->name.startsWith("홍")).distinct().forEach(name->System.out.println(name));
>> 이름이 3글자 이상이고, "홍"으로 시작하는 성씨를 중복을 없애서 하나씩 출력한다.
>> 홍길동, 홍가가, 홍나나, 홍길순
'프로그래밍 언어 > Java' 카테고리의 다른 글
[Java] Thread#1, 스레드의 개념 및 기본 예제 (1) | 2019.09.02 |
---|---|
[Java] 자바, 가비지 컬렉터(Garbage Collector) (0) | 2019.04.21 |
[Java] 자바 #46, 람다식의 함수형 인터페이스 개념 및 예제 (0) | 2019.03.17 |
[Java] 자바 #45, 람다식 예제 및 활용 (3) | 2019.03.16 |
[Java] 자바 #44, String split(), StringTokenizer 클래스 ( 문자열 분리 , 쪼개기) (5) | 2019.03.11 |