[그린컴퓨터] Server/JAVA(자바 JDK)

스트림 { 개요, 중간연산과 최종연산, 연산 종류, 연습문제 }

Ben의 프로그램 2023. 7. 4. 09:31
728x90

  • 스트림은 자료구조 중에서 배열과 컬렉션을 처리할 때 주로 사용하는 클래스입니다. 

  • 따라서 배열 & 컬렉션 데이터 소스가 필수적으로 필요합니다. 

  • 중간연산은 js 의 체이닝 기술처럼 반복적으로 사용할 수 있다.  

package stream;

import java.util.Arrays;
import java.util.stream.IntStream;
import java.util.stream.Stream;

public class Ex1 {

	public static void main(String[] args) {
		int[] intArr = {1, 5, 3, 2, 4};
		
		IntStream stream1 = Arrays.stream(intArr);
		stream1.limit(3).sorted().forEach(n->System.out.println(n));
		// intArr 배열을 정렬하고 3개를 뽑아서 출력하는 기능까지
		
		String[] strArr = {"abcde", "abc", "cdefgh"};
		
		Stream<String> stream2 = Arrays.stream(strArr);
		long count = stream2.filter(s->s.length() >= 5).count();
		System.out.println("배열에서 크기가 5이상인 문자열은 " + count + "개 입니다");
		// stream1 은 최종 연산까지 진행한 상태이므로 다시 사용할 수 없고, 
		// 새로운 stream 클래스를 생성해서 사용해야 한다. 
	}
}

  • 스트림 클래스는 이처럼 우리가 필요한 기능들을 미리 만들어 놓았기 때문에 매우 편리하다.  
package stream;

import java.util.ArrayList;
import java.util.List;
import java.util.stream.Stream;

public class Ex2 {

	public static void main(String[] args) {
		List<String> list = new ArrayList<String>();
		list.add("Tomas");
		list.add("Edward");
		list.add("Jack");

		Stream<String> stream1 = list.stream();

		stream1.filter(s -> s.length() >= 5).sorted().forEach(s -> System.out.println(s));

		System.out.println();
		list.stream().map(s -> s.length()).forEach(n -> System.out.println(n));
	}

}

  •  

package stream;

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

public class Ex3 {

	public static void main(String[] args) {
		List<Integer> list = Arrays.asList(5, 1, 2, 4, 3);
		Stream<Integer> stream = list.stream(); // 리스트에서 스트림 생성
		int sum = stream.mapToInt(n -> n.intValue()).sum();

		list.stream().sorted().forEach(n -> System.out.println(n));
		System.out.println("스트림 정렬 후 리스트: " + list);

		list.stream().filter(n -> n >= 3).sorted().forEach(n -> System.out.println(n));
	}
}

  • 스트림은 원본 자료를 변경하지 않는다는 것을 확인할 수 있는 예제이다.
Q. 
패키지 여행을 떠나는 고객들이 있다. 고객의 정보는 TravelCustomer 클래스에 담는다. (이름, 나이, 여행비용)
그리고 TravelCustomer 형 리스트에 고객 명단을 담는다. 
고객의 명단 출력, 여행의 총 비용 출력, 20세 이상 고객 명단 출력
package stream;

import java.util.ArrayList;
import java.util.List;
import java.util.stream.Stream;

class TravelCustomer {
	String name;
	int age;
	int cost;

	public TravelCustomer(String name, int age, int cost) {
		super();
		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 class Q1 {

	public static void main(String[] args) {
		List<TravelCustomer> travelCustomerList = new ArrayList<TravelCustomer>();
		TravelCustomer duli = new TravelCustomer("둘리", 40, 100);
		TravelCustomer ddochi = new TravelCustomer("또치", 13, 50);
		TravelCustomer downer = new TravelCustomer("도우너", 25, 70);

		travelCustomerList.add(duli);
		travelCustomerList.add(ddochi);
		travelCustomerList.add(downer);
		
		//1.
		System.out.println("== 고객 명단 추가된 순서대로 출력 ==");
		travelCustomerList.stream()
			.map(c->c.getName())
			.forEach(s->System.out.println(s));
		
		//2.
		int total = travelCustomerList.stream()
				.mapToInt(c->c.getCost())
				.sum();
		System.out.println("총 여행 비용 :" + total);
		
		//3.
		System.out.println("== 20세 이상 고객 명단 정렬하여 출력 ==");
		travelCustomerList.stream()
			.filter(c->c.getAge() >= 20).map(c->c.getName()).sorted()
			.forEach(s->System.out.println(s));
	}

}

  • 리스트에 객체를 담은 후 객체 안의 정보를 stream 과 함께 사용했다. 
  • 위 예제에서는 객체를 리스트에 담았기 때문에 각 객체의 정보를 getter 를 사용해서 사용했다.