KDT/Java

240314 Java - 람다식 2, 스트림 1

001cloudid 2024. 3. 14. 17:45
728x90

람다식

매개변수로 전달하는 람다식

package test17;

//함수형 인터페이스 : 람다식을 만들기 위한 인터페이스
@FunctionalInterface
interface PrintString{
	//추상 메소드
	void showString(String str);
}
/*
class aa implements PrintString{
	@Override
	public void showString(String str) {
		System.out.println("showString() 메소드 구현");
		System.out.println(str);
	}
}
*/
public class TestLambda1 {
	
	//매개변수로 전달하는 람다식
	//								lambda 함수 인터페이스로 구현한 익명구현 객체
	//								람다식(익명함수)이 들어있는 변수
	public static void showMyString(PrintString p) {
		p.showString("매개변수를 인터페이스형으로 받음. 메소드의 매개변수로 람다식을 대입한 변수 전달");
	}

	public static void main(String[] args) {
		
		/*
		//인터페이스를 구현한 클래스로 사용하는 방법(객체 기반)
		aa a1 = new aa();
		a1.showString("Override 시켜 구현한 메소드 호출");
		
		System.out.println("============================");
		
		//인터페이스 변수
		PrintString ps = new aa();
		ps.showString("인터페이스 변수로 Override 시켜 구현한 메소드 호출");
		*/

		/*
		//익명 클래스, 익명 구현 객체로 사용하는 방법
		PrintString ps1 = new PrintString() {
			
			@Override
			public void showString(String str) {
				System.out.println("showString() 익명 메소드 구현");
				System.out.println(str);
			}
		};
		ps1.showString("익명 클래스, 익명 구현 객체를 생성");
		*/
		
		//람다식으로 사용하는 방법
		//람다식을 인터페이스형 변수에 대입하고 그 변수를 사용해 람다식 구현부 호출 -> 수식 형태로 구분(익명 함수 형태)
		PrintString lambdaStr = str -> System.out.println(str);
		lambdaStr.showString("람다식을 인터페이스형 변수에 대입하고 그 변수를 사용해 람다식 구현부 호출");
		//public static void showMyString(PrintString p) 람다식을 매개변수로 전달받은 함수 호출 확인
		showMyString(lambdaStr);
		
		
	}

}

 

반환 값으로 쓰이는 람다식

package test17;

//함수형 인터페이스 : 람다식을 만들기 위한 인터페이스
@FunctionalInterface
interface PrintString{
	//추상 메소드
	void showString(String str);
}
/*
class aa implements PrintString{
	@Override
	public void showString(String str) {
		System.out.println("showString() 메소드 구현");
		System.out.println(str);
	}
}
*/
public class TestLambda1 {
	
	//매개변수로 전달하는 람다식
	//								lambda 함수 인터페이스로 구현한 익명구현 객체
	//								람다식(익명함수)이 들어있는 변수
	public static void showMyString(PrintString p) {
		p.showString("매개변수를 인터페이스형으로 받음. 메소드의 매개변수로 람다식을 대입한 변수 전달");
	}
	
	
	//람다식을 반환하는 메소드 : 반환형 PrintString
	public static PrintString returnString() {
//		PrintString str = s -> System.out.println(s + "returnString()");
//		return str;
		return s -> System.out.println(s+"returnString()"); //호출한 곳으로 돌려보낸다.
	}

	public static void main(String[] args) {
		
		/*
		//인터페이스를 구현한 클래스로 사용하는 방법(객체 기반)
		aa a1 = new aa();
		a1.showString("Override 시켜 구현한 메소드 호출");
		
		System.out.println("============================");
		
		//인터페이스 변수
		PrintString ps = new aa();
		ps.showString("인터페이스 변수로 Override 시켜 구현한 메소드 호출");
		*/

		/*
		//익명 클래스, 익명 구현 객체로 사용하는 방법
		PrintString ps1 = new PrintString() {
			
			@Override
			public void showString(String str) {
				System.out.println("showString() 익명 메소드 구현");
				System.out.println(str);
			}
		};
		ps1.showString("익명 클래스, 익명 구현 객체를 생성");
		*/
		
		//람다식으로 사용하는 방법
		//람다식을 인터페이스형 변수에 대입하고 그 변수를 사용해 람다식 구현부 호출 -> 수식 형태로 구분(익명 함수 형태)
		PrintString lambdaStr = str -> System.out.println(str);
		lambdaStr.showString("람다식을 인터페이스형 변수에 대입하고 그 변수를 사용해 람다식 구현부 호출");
		//public static void showMyString(PrintString p) 람다식을 매개변수로 전달받은 함수 호출 확인
		showMyString(lambdaStr);
		
		System.out.println("============================");
		
		//람다식 반환받기 : 람다식을 변수에 대입
		PrintString reStr = returnString();
		reStr.showString("PrintString ");
		
	}

}

 

package test17;

//함수형 인터페이스 : 람다식을 만들기 위한 인터페이스
@FunctionalInterface
interface PrintString{
	//추상 메소드
	void showString(String str);
}
/*
class aa implements PrintString{
	@Override
	public void showString(String str) {
		System.out.println("showString() 메소드 구현");
		System.out.println(str);
	}
}
*/
public class TestLambda1 {
	
	//매개변수로 전달하는 람다식
	//								lambda 함수 인터페이스로 구현한 익명구현 객체
	//								람다식(익명함수)이 들어있는 변수
	public static void showMyString(PrintString p) {
		p.showString("매개변수를 인터페이스형으로 받음. 메소드의 매개변수로 람다식을 대입한 변수 전달");
	}
	
	
	//람다식을 반환하는 메소드 : 반환형 PrintString
	public static PrintString returnString() {
//		PrintString str = s -> System.out.println(s + "returnString()");
//		return str;
		return s -> System.out.println(s+"returnString()"); //호출한 곳으로 돌려보낸다.
	}

	public static void main(String[] args) {
		
		/*
		//인터페이스를 구현한 클래스로 사용하는 방법(객체 기반)
		aa a1 = new aa();
		a1.showString("Override 시켜 구현한 메소드 호출");
		
		System.out.println("============================");
		
		//인터페이스 변수
		PrintString ps = new aa();
		ps.showString("인터페이스 변수로 Override 시켜 구현한 메소드 호출");
		*/

		/*
		//익명 클래스, 익명 구현 객체로 사용하는 방법
		PrintString ps1 = new PrintString() {
			
			@Override
			public void showString(String str) {
				System.out.println("showString() 익명 메소드 구현");
				System.out.println(str);
			}
		};
		ps1.showString("익명 클래스, 익명 구현 객체를 생성");
		*/
		
		//람다식으로 사용하는 방법
		//람다식을 인터페이스형 변수에 대입하고 그 변수를 사용해 람다식 구현부 호출 -> 수식 형태로 구분(익명 함수 형태)
		PrintString lambdaStr = str -> System.out.println(str);
		lambdaStr.showString("람다식을 인터페이스형 변수에 대입하고 그 변수를 사용해 람다식 구현부 호출");
		//public static void showMyString(PrintString p) 람다식을 매개변수로 전달받은 함수 호출 확인
		showMyString(lambdaStr);
		
		System.out.println("============================");
		
		//람다식 반환받기 : 람다식을 변수에 대입
		PrintString reStr = returnString();
		reStr.showString("PrintString ");
		
		//
		showMyString(lambdaStr);
		showMyString(reStr);
	}

}

 

Stream 인터페이스

  • 여러 값들이 들어있는 컬렉션이나 배열 등을 for문이 아닌 함수형 인터페이스를 이용해서 반복처리할 수 있는 기능
  • 람다식을 이용한 기술 중 하나로 데이터 소스를 조작 및 가공, 변환하여 원하는 값으로 반환해주는 인터페이스
  • 정의된 메소드들의 매개변수에 람다와 메소드 참조가 필요함

Stream 특징

  1. 원본 데이터를 변경하지 않음
  2. 재사용이 불가능한 일회용 스트림
  3. 내부 반복으로 작업을 처리할 수 있는 구조를 제공

 

스트림 생성하고 사용

package test17;

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

public class IntArrayTest {

	public static void main(String[] args) {

		//정수 배열에 스트림 사용
		int[] arr = {1,2,3,4,5};
		
		//합계 구하기
		int total = 0;
		for(int i = 0; i<=arr.length;i++) {
			total += i;
		}
		System.out.println(total);
		
		//또는
		int total1 = 0;
		for(int j : arr) {
			total1 += j;
		}
		System.out.println(total1);
		
		System.out.println("=====================");
		
		IntStream intstream1 = Arrays.stream(arr);
		intstream1.forEach(s -> System.out.println(s));
		
		System.out.println("=====================");
		int sumVal = Arrays.stream(arr).sum();
		System.out.println(sumVal);
		
		//count() 최종연산 메소드 long형으로 결과값을 돌려줌 -> 형 변환이 필요함
		int countVal = (int) Arrays.stream(arr).count();
		System.out.println(countVal);
		
		Object avgVal = Arrays.stream(arr).average();
		System.out.println(avgVal);
		
		System.out.println("=====================");
		IntStream intstream2 = IntStream.of(1,2,3,4,5);
		intstream2.forEach(s -> System.out.println(s));
		
		System.out.println("=====================");
		IntStream intstream3 = IntStream.range(1,10);
		intstream3.forEach(s -> System.out.println(s)); //1~9까지
		
		System.out.println("=====================");
		IntStream intstream4 = IntStream.rangeClosed(1,10);
		intstream4.forEach(s -> System.out.println(s)); //1~10까지
		
	}

}

 

package test17;

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

public class ArrayListStreamTest {

	public static void main(String[] args) {

		//ArrayList에서 스트림 사용
		List<String> sList = new ArrayList<String>();
//		==ArrayList<String> sList = new ArrayList<String>();
		sList.add("HTML");
		sList.add("CSS");
		sList.add("JavaScript");
		sList.add("Java");
		
		
		for(int i = 0 ; i < sList.size();i++) {
			System.out.println(sList.get(i));
		}
		
		System.out.println("======================");
		
		Stream<String> stream = sList.stream(); //스트림 생성
		stream.forEach(s->System.out.println(s + "")); //배열의 요소를 하나씩 출력
		
		System.out.println("======================");
		
		//스트림을 새로 생성	정렬		요소를 하나씩 꺼내어 출력
		sList.stream().sorted().forEach(s->System.out.println(s + ""));
	}

}

 

 

728x90

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

240320 Java - 스레드 2  (0) 2024.03.20
240318 Java - 스트림 3, 스레드 1  (0) 2024.03.18
240313 Java - 람다식  (0) 2024.03.13
240311 Java - 내부 클래스2  (0) 2024.03.11
240307 Java 입출력 스트림 3, 내부 클래스 1  (0) 2024.03.07