728x90

스트림

스트림이란 자료의 대상과 상관없이 동일한 연산을 수행하는 기능이다.

배열, 컬렉션에 동일한 연산을 수행해서 일관된 기능을 제공한다.

한번 사용한 스트림은 재사용이 불가능하므로 매번 새로 생성한다.

스트림은 기존 자료를 변경하지 않는다. (함수에서 const &로 매개변수를 받아오는 것과 비슷한건가 싶다.)

중간 연산과 최종 연산으로 단계가 나뉜다.

최종 연산이 수행되어야 모든 연산이 적용된다.

 

중간연산

filter() 나 map() 등이 있다.

filter는 조건에 맞는 것들을 고르는 것

map은 맞는 요소를 가져오는 것?

예시를 보자.

filter() 사용 예시

 

map() 사용 예시

중간 연산은 여러번 사용할 수 있다. 즉 filter()를 한 후 다시 map을 할 수 있다. 나중에 사용 예시에서 보자.

 

최종 연산

스트림의 모든 자료를 소모하며 연산을 수행한다.

최종 연산 후에는 다른 연산을 할 수 없다.

forEach() : 요소를 하나씩 꺼내옴

count() : 요소의 개수를 센다

sum() : 합을 구한다. 이 외에도 여러 연산이 있다.

 

 

 

reduce() 연산

정의 되어있는 연산이 아닌 프로그래머가 직접 정의해서 연산하는 방법.

reduce() 연산 예시

사용 예시

package stream;

public class Customer {
	private String name;
	private int age;
	private int cost;
	
	Customer(){}
	public Customer(String name, int age, int cost) {
		this.name = name;
		this.age = age;
		this.cost = cost;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	public int getCost() {
		return cost;
	}
	public void setCost(int cost) {
		this.cost = cost;
	}
	public String toString() {
		return name + ", " + age + ", " + cost;
	}
}

고객의 정보를 제공하는 이런 클래스가 있다.

이 클래스를 컬렉션으로 선언한 후 자료를 원하는 대로 모아서 출력해보자.

 

 

package stream;

import java.util.ArrayList;

public class CustomerTest {

	public static void main(String[] args) {

		ArrayList<Customer> list = new ArrayList<Customer>();
		list.add(new Customer("이순신", 40, 100));
		list.add(new Customer("김유신", 20, 100));
		list.add(new Customer("홍길동", 13, 50));
		
		System.out.println(list); //toString()으로 출력
		
		list.stream().forEach(c ->{System.out.println(c.getName());});
		int suma = list.stream().mapToInt(c->c.getCost()).sum();
		System.out.println(suma);
		
		list.stream().filter(c->c.getAge()>=20).map(c->c.getName()).sorted().forEach(s->System.out.println(s));
	}

}

ArrayList를 선언해서 세 명의 고객을 추가했다.

첫 번째 출력문을 보면 이건 기존의 방식으로, 고객 정보를 toString()에서 정의한 대로 출력한다.

[이순신, 40, 100, 김유신, 20, 100, 홍길동, 13, 50] 이렇게 출력이 된다.

 

이제 다음 stream을 보자. 바로 최종 연산을 사용했다. 각각의 c에 대해서 getName()을 출력한다. 즉 모든 고객의 이름을 출력하므로

이순신

김유신

홍길동 이 출력된다.

 

다음 suma 출력을 보자. c의 가격을 다 합한 후 suma에 대입하고 출력한다.

250이 출력될 것이다.

 

마지막 출력문을 보자. 아까 말한대로 중간연산이 여러번 사용되었다.

filter(c->c.getAge()>=20).map(c->c.getName()).sorted().    까지가 중간 연산이다.

하나씩 살펴보면 어렵지 않다.

age가 20 이상인 자료 중에서 -> 이름을 가져온 후 -> 이름으로 정렬한다.

그 후 각각에 대해 출력한다.

김유신

이순신  이 출력될것이다.

 

 

728x90

'프로그래밍 > Java' 카테고리의 다른 글

[Java] 입출력 스트림  (0) 2020.02.10
[Java] 예외(Exception)  (0) 2020.02.08
[Java] 람다식  (0) 2020.02.06
[Java] 내부 클래스  (0) 2020.02.06
[Java] 컬렉션(Collection) 프레임워크  (0) 2020.02.04

+ Recent posts