KDT/Java

240318 Java - 스트림 3, 스레드 1

001cloudid 2024. 3. 18. 12:50
728x90

스트림

스트림 연산

 

스트림 생성 - 중간 연산 - 최종 연산

package test17;

import java.util.Arrays;
import java.util.List;

public class ArrayListStreamTest2 {

	public static void main(String[] args) {

		//문자열 스트림 객체를 생성해서 중복 제거, 필터링으로 출력
		//List객체 생성
		List<String> list = Arrays.asList("a","b","a","c","a","d");
		
		list.stream().forEach(a -> System.out.print(a + " "));
		
		System.out.println();
		
		//distinct() 메소드로 중복 제거 후 내부 반복자로 출력
		list.stream().distinct().forEach(s -> System.out.print(s + " "));;
		
	}

}

 

package test17;

import java.util.Arrays;
import java.util.List;

public class ArrayListStreamTest2 {

	public static void main(String[] args) {

		//문자열 스트림 객체를 생성해서 중복 제거, 필터링으로 출력
		//List객체 생성
		List<String> list = Arrays.asList("a","b","a","c","a","d");
		
		list.stream().forEach(a -> System.out.print(a + " "));
		
		System.out.println();
		
		//distinct() 메소드로 중복 제거 후 내부 반복자로 출력
		list.stream().distinct().forEach(s -> System.out.print(s + " "));;
		
		System.out.println();
		
		//"a"인 문자열로 필터링 후 내부 반복자로 출력
		list.stream().filter(m -> m.startsWith("a")).forEach(b -> System.out.print(b + " "));;
		
	}

}

 

package test17;

import java.util.Arrays;
import java.util.List;

public class ArrayListStreamTest2 {

	public static void main(String[] args) {

		//문자열 스트림 객체를 생성해서 중복 제거, 필터링으로 출력
		//List객체 생성
		List<String> list = Arrays.asList("a","b","a","c","a","d");
		
		list.stream().forEach(a -> System.out.print(a + " "));
		
		System.out.println();
		
		//distinct() 메소드로 중복 제거 후 내부 반복자로 출력
		list.stream().distinct().forEach(s -> System.out.print(s + " "));;
		
		System.out.println();
		
		//"a"인 문자열로 필터링 후 내부 반복자로 출력
		list.stream().filter(m -> m.startsWith("a")).forEach(m -> System.out.print(m + " "));;
		
		System.out.println();
		
		//중복 제거와 "a"인 문자열 필터링 후 내부 반복자로 출력
		list.stream().distinct().filter(o -> o.startsWith("a")).forEach(b -> System.out.print(b + " "));
	}

}

 

package test17;

import java.util.Arrays;
import java.util.List;

public class ArrayListStreamTest2 {

	public static void main(String[] args) {

		//문자열 스트림 객체를 생성해 문자열의 길이값으로 구성된 IntStream 객체를 생성한 후 내부 반복자로 반복하면서 해당 요소의 문자열의 길이
		//mapping : 스트림의 데이터를 매개변수로 받아 가공해 새로운 스트림을 만들어서 리턴
		//			데이터의 변환을 위한 기능으로 스트림의 요소를 다른 요소와 매핑해서 대체할 수 있는 기능
		//int 타입을 받아 IntStream객체 리턴
		
		List<String> listint = Arrays.asList("HTML","CSS","Javascript","Java");
		listint.stream().mapToInt(t -> t.length()).forEach(u -> System.out.print(u + " ")); 
		
		
	}

}

 

package test17;

import java.util.Arrays;
import java.util.List;

public class ArrayListStreamTest2 {

	public static void main(String[] args) {

		//문자열 스트림 객체를 생성해 문자열의 길이값으로 구성된 IntStream 객체를 생성한 후 내부 반복자로 반복하면서 해당 요소의 문자열의 길이
		//mapping : 스트림의 데이터를 매개변수로 받아 가공해 새로운 스트림을 만들어서 리턴
		//			데이터의 변환을 위한 기능으로 스트림의 요소를 다른 요소와 매핑해서 대체할 수 있는 기능
		//int 타입을 받아 IntStream객체 리턴
		
		List<String> listint = Arrays.asList("HTML","CSS","Javascript","Java");
		listint.stream().mapToInt(t -> t.length()).forEach(u -> System.out.print(u + " ")); 
		
        //함수형 인터페이스의 메소드 참조 방식
		listint.stream().mapToInt(String::length).forEach(System.out::println); 
		
	}

}

 

package test17;

import java.util.Arrays;
import java.util.Comparator;
import java.util.List;

public class ArrayListStreamTest2 {

	public static void main(String[] args) {
		
		//함수형 인터페이스 방식
		List<String> listint = Arrays.asList("HTML","CSS","Javascript","Java");
		listint.stream().mapToInt(t -> t.length()).forEach(u -> System.out.print(u + " ")); 
		
		System.out.println();
		
		//함수형 인터페이스의 메소드 참조 방식
		listint.stream().mapToInt(String::length).forEach(System.out::println); 
		
		System.out.println();
		
		//정렬
		listint.stream().sorted().forEach(System.out::println); //오름차순
		System.out.println();
		listint.stream().sorted(Comparator.reverseOrder()).forEach(System.out::println); //내림차순
		
		
	}

}

 

스트림 -> 람다식으로 처리

Steam은 함수형 인터페이스 표준 API, 미리 만들어져있어 제공됨

함수형 인터페이스 종류는 Consumer, Supplier, Function, Operator, Predicate

 

스트림 활용

package test17;

public class TravelCustomer {
	private String name;
	private int price;
	private int grade;
	
	public TravelCustomer() {}
	
	public TravelCustomer(String name, int price, int grade) {
		this.name = name;
		this.grade = grade;
		this.price = price;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public int getPrice() {
		return price;
	}

	public void setPrice(int price) {
		this.price = price;
	}

	public int getGrade() {
		return grade;
	}

	public void setGrade(int grade) {
		this.grade = grade;
	}

	@Override
	public String toString() {
		return "이름 : " + name + ", 가격 : " + price + ", 등급 : " + grade;
	}
	
	
	
}

 

package test17;

import java.util.ArrayList;
import java.util.List;

public class TravelCustomerTest {

	public static void main(String[] args) {
		TravelCustomer tc1 = new TravelCustomer("이성계", 100, 1);
		TravelCustomer tc2 = new TravelCustomer("이방원", 300, 3);
		TravelCustomer tc3 = new TravelCustomer("이방과", 50, 2);

		List<TravelCustomer> customerList = new ArrayList<TravelCustomer>();
		customerList.add(tc1);
		customerList.add(tc2);
		customerList.add(tc3);
		
		System.out.println("고객 명단을 추가된 순서대로 출력");
		customerList.stream().map(c -> c.getName()).forEach(System.out::println);
		
		System.out.println();
		
		int total = customerList.stream().mapToInt(p -> p.getPrice()).sum();
		System.out.println("총 비용 : "+total);
		
		System.out.println();
		System.out.println("등급이 2이상 고객 명단 정렬하여 출력");
		customerList.stream().filter(g -> g.getGrade()>=2).map(n -> n.getName()).sorted().forEach(System.out::println);
	
		
		
	}

}

 

Thread

package test18;

public class Thread1 {

	public static void main(String[] args) {

		//스레드(Thread)
		//하나의 프로세스에서 동시에 기능을 처리하기 위한 목적으로 사용되는 실행 단위
		//하나의 프로세스에는 1개 이상의 스레드가 존재함
		//싱글(메인) 스레드 : 최초 실행 시 메인 스레드가 main() 함수를 실행시킴
		//멀티 스레드 : 하나의 기능을 실행할 수 있는 실행 단위(스레드)가 여러 개인 것을 말함
		//스레드를 사용하는 목적은 '동시 작업 처리'
		
		//JVM이 운영체제 역할을 함(CPU 역할)
		//자바는 프로세스가 존재하지 않고 스레드만 존재
		//JVM에 의해 스케쥴되는 실행 단위 코드 블록. 하나의 프로세스(응용 프로그래밍) 내에서 여러 가지 작업을 동시에 수행 할 수 있게 하는 것
		
		//스레드를 만드는 2가지 방법
		//1) Thread 클래스를 상속받아 Thread 작성
		//	 Thread 클래스를 상속받아 run() 메소드를 오버라이딩 함으로써 구현 하는 방식
		
		//2) java.lang.Runnable 인터페이스를 구현하여 Thread 작성 
		//	 Runnable 인터페이스를 구현함으로써 Thread를 사용하는 방식. main에서 Thread 생성 정보로 구현한 클래스의 객체를 넘겨줌으로써 객체를 생성하는 방식
		
		//메소드
		//start() run()메소드 호출
		//run() 스레드가 실행할 부분에 기술하는 스레드 코드로 오버라이딩하여 스레드 코드를 작성. 메소드가 종료하면 스레드도 종료됨
		
		//1. 싱글 스래드
		for(int i=0;i<300;i++) {
			System.out.println("$ "+(i+1));
		}
		
		for(int i=0;i<300;i++) {
			System.out.println("* "+(i+1));
		}
		System.out.println();
		System.out.println("main 스레드 종료");
		
		
	}

}

 

package test18;

//첫번째 스레드 : Thread 클래스를 상속받아서 구현 run() 메소드 오버라이드
class One extends Thread{

	@Override
	public void run() {

		for(int i=0;i<300;i++) {
		System.out.println("$ "+(i+1));
		}
		System.out.println("One 스레드 종료");
	}
}

//두번째 스레드 : Runnable 인터페이스 구현 run()메소드 오버라이드
class Two implements Runnable{

	@Override
	public void run() {
		
		for(int i=0;i<300;i++) {
			System.out.println("* "+(i+1));
		}
		System.out.println("Two 스레드 종료");
	}
}


public class Thread2{
	
	public static void main(String[] args) {

		//멀티 스레드 : 수행할 여러 개의 작업 단위의 코드를 블록으로 작성하고 수행
		// -> run() 메소드 내에 수행할 동작 코드를 작성(오버라이드)
		
		//첫번째 스레드
		One t1 = new One(); //Thread 클래스의 멤버를 사용하여 스레드 처리 할 수 있음
		t1.start(); //run()메소드 내의 코드를 수행시킴
		
		//두번째 스레드
		//인터페이스 변수명 = new 구현클래스();
		Runnable t2 = new Two();
		Thread thread = new Thread(t2); //Runnable 인터페이스 내의 run()메소드를 수행시킬 Thread 클래스의 멤버들을 사용하기 위해 Thread 클래스의 생성자에 인터페이스 변수명을 대입
		thread.start();
		
		System.out.println("main 스레드 종료");
		
		
		//순서대로 처리 되는 것이 아니라 동시에 처리됨
	}

}

 

728x90

'KDT > Java' 카테고리의 다른 글

240321 Java - 스레드 3  (0) 2024.03.21
240320 Java - 스레드 2  (0) 2024.03.20
240314 Java - 람다식 2, 스트림 1  (0) 2024.03.14
240313 Java - 람다식  (0) 2024.03.13
240311 Java - 내부 클래스2  (0) 2024.03.11