[Java] Java Stream

nooyji·2022년 10월 18일
0
post-custom-banner

명령형 프로그래밍 vs 선언형 프로그래밍
Imperative Programming vs Declarative Programming

명령형 프로그래밍

  • OOP 객체 지향 프로그래밍
  • How to do ?
  • 어떻게 하여야 하는가 ?

선언형 프로그래밍

  • Functional Programming
  • What to do ?
  • 무엇을 하여야 하는가 ?

ex) 유저 리스트가 주어졌을 때, 검증되지 않은 (unverified) 유저들의 이메일을 리스트로 주세요.

명령형 프로그래밍
How to do ?
1. 이메일을 담을 리스트 선언
2. 루프
3. 유저 선언
4. 검증되지 않았는지 체크
5. 않았다면 변수에 이메일 추출
6. 이메일 리스트에 넣기

선언형 프로그래밍
What to do ?
1. 유저리스트에서
1. 검증되지 않은 유저만
골라내서
2. 이메일을 추출해서
2. 리스트로 받기

1급 시민으로서의 함수
Function as First-Class Citizen

1급 시민의 조건

  • 함수/메서드의 매개변수(parameter)로서 전달할 수 있는가
  • 함수/메서드의 반환값(return)이 될 수 있는가
  • 변수에 담을 수 있는가

Functional Programming
함수들을 object의 형태로 나타낼 수 있게 해주는 방법을 제공

함수형 프로그래밍을 통해 우리가 얻는 것들

역할에 충실한 코드 -> 가독성 좋은 코드, 유지/보수에 용이, 버그로부터 안전, 확장성에 용이

패러다임의 전환 -> Stream, Optional, ..다양한 활용 가능성

Lambda Expression

  1. Function Interface

interface 선언, interface 는 설계도 같은 기능 ..
구현되지 않은 함수들을 포함하고 있다

@FunctionalInterface
public interface Function<T, R> {
	R apply(T t);
}

package util 로 만들고 class Adder 생성
function interface 를 implements
function 을 import

return type : Integer
이름은 apply
input type : Integer

import java.util.function.Function;
public class Adder implements Function<Integer, Integer> {
	public Integer apply(Integer x) {
    	return x + 10;
    }
}

object 는 new 로 선언

package com.fastcampus.functionalprogramming.chapter3;

import java.util.function.Function;

import com.fastcampus.functionalprogramming.chapter3.util.Adder;

public class Chapter3Section1 {
	
    public static void main(String[] args) {
    	Function<Integer, Integer> myAdder = new Adder();
        int result = myAdder.apply(5);
        system.out.println(result); // 15 출력
    }
    
}
  1. 한 걸음씩 람다로

함수의 구성요소
함수의 이름
반환값의 타입 (return type)
매개변수 (parameters)
함수의 내용 (body)

Lambda Expression

(Integer x) -> {
	return x + 10;
}
package com.fastcampus.functionalprogramming.chapter3;

import java.util.function.Function;

// import Adder 가 필요없음. (클래스 만들 필요 x)

public class Chapter3Section2 {

	public static void main(String[] args) {
    	Function<Integer, Integer> myAdder = (Integer x) -> {
        	return x + 10;
        };
        // 아래의 간결한 명령문으로 대체 가능
        Function<Integer, Integer> myAdder = x -> x + 10;
        int result = myAdder.apply(3);
        System.out.println(result);
    }
}

매개변수의 타입이 유추 가능할 경우 타입 생략 가능
매개변수가 하나일 경우 괄호 생략 가능
바로 리턴하는 경우 중괄호 생략 가능

  1. BiFunction Interface
    매개변수가 두 개일 때
@FunctionalInterface
public interface BiFunction<T, U, R> {
	R apply(T t, U u);
}
// Input parameter type T, U
// return  R
package com.fastcampus.functionalprogramming.chapter3;

import java.util.function.BiFunction;

public class Chapter3Section3 {
	public static void main(String[] args) {
    	Bifunction<Integer, Integer, Integer> add = (Integer x, Integer y) -> {
        	return x + y;
        };
        // 아래의 간결한 명령문으로 대체 가능
        Bifunction<Integer, Integer, Integer> add = (x, y) -> x + y;
        int result = add.apply(3, 5);
        System.out.println(result);
    }
}
  1. Functional Interface
post-custom-banner

0개의 댓글