[Java] 자바 #47, 스트림의 개념 및 예제

람다식을 배운 목적

 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글자 이상이고, "홍"으로 시작하는 성씨를 중복을 없애서 하나씩 출력한다. 

>> 홍길동, 홍가가, 홍나나, 홍길순


댓글

Designed by JB FACTORY