SEB TILπŸ‘

TIL - μ• λ„ˆν…Œμ΄μ…˜, λžŒλ‹€, stream

Jeein0313 2023. 3. 8. 22:54

λ“œλ””μ–΄ 였늘 stream을 λ°°μ› λ‹€!! γ…‹γ…‹ 혼자 곡뢀할 λ•Œ stream을 μ •λ¦¬ν•΄λ³΄κΈ°λ‘œ ν•˜κ³  계속 λ―Έλ€˜μ—ˆλŠ”λ° μ •λ¦¬λœ λ‚΄μš©μœΌλ‘œ λ°°μš°λ‹ˆ ν™•μ‹€νžˆ μ΄ν•΄ν•˜κΈ°λ„ 쉽고, μ’‹μ•˜λ‹€ γ…‹γ…‹ λžŒλ‹€μ™€ stream μ—­μ‹œ μ—°μŠ΅μœΌλ‘œ μ²΄ν™”μ‹œμΌœμ•Όκ² λ‹€.😁

 

 

 

❓Annotationλž€?

주석과 λΉ„μŠ·ν•œ μ• λ„ˆν…Œμ΄μ…˜μ€ 정보 전달을 λͺ©μ μœΌλ‘œ λ§Œλ“€μ–΄μ§„ 문법 μš”μ†Œλ‘œ, 주석은 개발자, 즉 μ‚¬λžŒμ—κ²Œ 정보λ₯Ό μ „λ‹¬ν•˜λŠ” 거라면 μ• λ„ˆν…Œμ΄μ…˜μ€ compiler, λ‹€λ₯Έ ν”„λ‘œκ·Έλž¨μ—κ²Œ 정보λ₯Ό μ „λ‹¬ν•œλ‹€. (ex. @Override)

 

 

 

β“μ• λ„ˆν…Œμ΄μ…˜μ˜ μ’…λ₯˜λŠ” 무엇이 μžˆλŠ”κ°€?

JDKμ—μ„œ μ œκ³΅ν•˜λŠ” μ• λ„ˆν…Œμ΄μ…˜κ³Ό λ‹€λ₯Έ ν”„λ‘œκ·Έλž¨μ—μ„œ μ œκ³΅ν•˜λŠ” μ• λ„ˆν…Œμ΄μ…˜μœΌλ‘œ λ‚˜λ‰˜λ©°, μ „μžλŠ” ν‘œμ€€ μ• λ„ˆν…Œμ΄μ…˜, ν›„μžλŠ” 메타 μ• λ„ˆν…Œμ΄μ…˜μ΄λΌ ν•œλ‹€.

 

 

 

β“ν‘œμ€€ μ• λ„ˆν…Œμ΄μ…˜ μ•Œμ•„λ³΄κΈ°

  • @Override : λ©”μ„œλ“œ μ•žμ—λ§Œ 뢙일 수 μžˆλŠ” μ• λ„ˆν…Œμ΄μ…˜μœΌλ‘œ μ„ μ–Έν•œ λ©”μ„œλ“œκ°€ μƒμœ„ 클래슀의 λ©”μ„œλ“œλ₯Ό μ˜€λ²„λΌμ΄λ”©ν•˜κ±°λ‚˜ 좔상 λ©”μ„œλ“œλ₯Ό κ΅¬ν˜„ν•˜λŠ” λ©”μ„œλ“œλΌλŠ” 것을 μ»΄νŒŒμΌλŸ¬μ—κ²Œ μ•Œλ €μ£ΌλŠ” μ—­ν• 
  • @Deprecated : 기쑴에 μ‚¬μš©ν•˜λ˜ 기술이 λ‹€λ₯Έ 기술둜 λŒ€μ²΄λ˜μ–΄ κΈ°μ‘΄ κΈ°μˆ μ„ μ μš©ν•œ μ½”λ“œλ₯Ό 더 이상 μ‚¬μš©ν•˜μ§€ μ•Šλ„λ‘ μœ λ„ν•˜λŠ” κ²½μš°μ— μ‚¬μš©ν•¨.
  • @SuppressWarnings : 컴파일 κ²½κ³  λ©”μ‹œμ§€κ°€ λ‚˜νƒ€λ‚˜μ§€ μ•Šλ„λ‘ 함. κ²½μš°μ— 따라 κ²½κ³ κ°€ λ°œμƒν•  것이 μΆ©λΆ„νžˆ μ˜ˆμƒλ¨μ—λ„ 묡인해야 ν•  경우 μ‚¬μš©ν•¨.
  • @FunctionalInterace : ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€λ₯Ό μ„ μ–Έν•  λ•Œ, μ»΄νŒŒμΌλŸ¬κ°€ ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€μ˜ 선언이 λ°”λ₯΄κ²Œ λ˜μ—ˆλŠ”μ§€ ν™•μΈν•˜λ„λ‘ 함. 

 

 

 

❓메타 μ• λ„ˆν…Œμ΄μ…˜ μ•Œμ•„λ³΄κΈ°

μ• λ„ˆν…Œμ΄μ…˜μ„ μ •μ˜ν•˜λŠ” 데에 μ‚¬μš©λ˜λŠ” μ• λ„ˆν…Œμ΄μ…˜μœΌλ‘œ μ• λ„ˆν…Œμ΄μ…˜μ˜ 적용 λŒ€μƒ 및 μœ μ§€ 기간을 μ§€μ •ν•˜λŠ” 데 μ‚¬μš©λ¨.

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.SOURCE)
public @interface Override {
}
  • @Target : μ• λ„ˆν…Œμ΄μ…˜μ„ μ μš©ν•  λŒ€μƒμ„ μ§€μ •
  • @Documented : μ• λ„ˆν…Œμ΄μ…˜μ— λŒ€ν•œ 정보가 javadoc으둜 μž‘μ„±ν•œ λ¬Έμ„œμ— ν¬ν•¨λ˜λ„λ‘ ν•˜λŠ” μ• λ„ˆν…Œμ΄μ…˜ μ„€μ •
  • @Inherited : ν•˜μœ„ ν΄λž˜μŠ€κ°€ μ• λ„ˆν…Œμ΄μ…˜μ„ 상속받도둝 함
  • @Retention : μ• λ„ˆν…Œμ΄μ…˜μ˜ 지속 μ‹œκ°„μ„ κ²°μ •ν•˜λŠ” 데 μ‚¬μš©. 
  • @Repeatable : μ• λ„ˆν…Œμ΄μ…˜μ„ μ—¬λŸ¬ 번 뢙일 수 μžˆλ„λ‘ ν—ˆμš©

 

 

 

β“μ‚¬μš©μž μ •μ˜ μ• λ„ˆν…Œμ΄μ…˜ μ•Œμ•„λ³΄κΈ°

μ‚¬μš©μžκ°€ 직접 μ• λ„ˆν…Œμ΄μ…˜μ„ μ •μ˜ν•΄μ„œ μ‚¬μš©

@interface μ• λ„ˆν…Œμ΄μ…˜λͺ… {//μΈν„°νŽ˜μ΄μŠ€ μ•žμ— @기호만 뢙이면 μ• λ„ˆν…Œμ΄μ…˜μ„ μ •μ˜ν•  수 있음
			νƒ€μž… μš”μ†Œλͺ…(); //μ• λ„ˆν…Œμ΄μ…˜ μš”μ†Œλ₯Ό μ„ μ–Έ
}

 

 

 

❓Lambda Expressionμ΄λž€?

λžŒλ‹€μ‹μ€ ν•¨μˆ˜ν˜• ν”„λ‘œκ·Έλž˜λ° 기법을 μ§€μ›ν•˜λŠ” μžλ°”μ˜ 문법 μš”μ†Œλ‘œ, λžŒλ‹€μ‹μ€ λ©”μ„œλ“œλ₯Ό ν•˜λ‚˜μ˜ μ‹μœΌλ‘œ ν‘œν˜„ν•œ 것.

μžλ°”λŠ” JDK 1.8 이후 λžŒλ‹€μ‹ λ“± ν•¨μˆ˜ν˜• ν”„λ‘œκ·Έλž˜λ° 문법 μš”μ†Œλ₯Ό λ„μž…ν•¨. (λžŒλ‹€μ‹μ„ μ΄μš©ν•˜λ©΄ 기쑴의 객체지ν–₯ ν”„λ‘œκ·Έλž˜λ°κ³Ό ν•¨μˆ˜ν˜• ν”„λ‘œκ·Έλž˜λ°μ„ ν˜Όν•©ν•˜λŠ” λ°©μ‹μœΌλ‘œ 보닀 효율적인 ν”„λ‘œκ·Έλž˜λ°μ„ ν•  수 μžˆλ‹€)

 

 

 

 

β“ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€

λžŒλ‹€μ‹μ€ 객체지ν–₯적 μ–Έμ–΄μ˜ νŠΉμ„±μ„ κ°€μ§„ μžλ°”μ˜ νŠΉμ„±μ— 따라 일반적인 ν•¨μˆ˜κ°€ μ•„λ‹ˆλΌ 읡λͺ…μ˜ 객체이기 λ•Œλ¬Έμ— ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€λ₯Ό μ΄μš©ν•˜λ©΄ κΈ°μ‘΄ μžλ°”μ˜ 문법 μš”μ†Œλ₯Ό ν•΄μ§€μ§€ μ•ŠμœΌλ©΄μ„œ ν•¨μˆ˜ν˜• ν”„λ‘œκ·Έλž˜λ° 기법을 μ‚¬μš©ν•  수 μžˆλ‹€.

 

 

 

 

β“λžŒλ‹€μ‹ κΈ°λ³Έ 문법

//κΈ°μ‘΄ λ©”μ„œλ“œ ν‘œν˜„ 방식
void sayHello(){
	System.out.println("Hello");
}
//μœ„μ˜ μ½”λ“œλ₯Ό λžŒλ‹€μ‹μœΌλ‘œ ν‘œν˜„ν•œ 식
() -> System.out.println("Hello");

λžŒλ‹€μ‹μ€ 기본적으둜 λ°˜ν™˜νƒ€μž…κ³Ό 이름을 μƒλž΅ν•  수 있음. 즉, λžŒλ‹€ν•¨μˆ˜λ₯Ό μ’…μ’… 이름이 μ—†λŠ” ν•¨μˆ˜, 즉 읡λͺ… ν•¨μˆ˜λΌ λΆ€λ₯΄κΈ°λ„ 함. λ©”μ„œλ“œ 바디에 싀행문이 ν•˜λ‚˜λ§Œ μ‘΄μž¬ν•  λ•Œ μ€‘κ΄„ν˜Έ, return λ¬Έ μƒλž΅ κ°€λŠ₯(μ„Έλ―Έμ½œλ‘ κΉŒμ§€)

λ§€κ°œλ³€μˆ˜ νƒ€μž…λ„ μƒλž΅ κ°€λŠ₯

public static void main(String[] args) {
    (int n1,int n2)-> {return n1+n2;}//λ°˜ν™˜ νƒ€μž…κ³Ό λ©”μ„œλ“œλͺ… 제거, ν™”μ‚΄ν‘œ μΆ”κ°€
		//(int n1,int n2)-> n1+n2 //더 μΆ•μ•½ κ°€λŠ₯
}
    
static int sum(int num1, int num2){ 
    return num1+num2;
}

 

 

 

 

β“ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€ μ‚¬μš©

ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€μ—λŠ” 단 ν•˜λ‚˜μ˜ 좔상 λ©”μ„œλ“œλ§Œ 선언될 수 μžˆλŠ”λ°, μ΄λŠ” λžŒλ‹€μ‹κ³Ό μΈν„°νŽ˜μ΄μŠ€μ˜ λ©”μ„œλ“œκ°€ 1:1둜 λ§€μΉ­λ˜μ–΄μ•Ό ν•˜κΈ° λ•Œλ¬Έ.

package codeStates;

public class LambdaExample {
    public static void main(String[] args) {
        SumFunction s = (n1, n2) -> n1 + n2;
        System.out.println(s.sum(2,3));

    }

    @FunctionalInterface
    interface SumFunction{
        int sum(int num1, int num2);
    }
}

 

 

 

β“μžλ°”μ—μ„œ 기본적으둜 μ œκ³΅ν•˜λŠ” ν•¨μˆ˜ν˜• λ©”μ„œλ“œ

λ§ˆμ§€λ§‰μœΌλ‘œ μžλ°”μ—μ„œλŠ” λΉˆλ²ˆν•˜κ²Œ μ‚¬μš©λ˜λŠ” ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€λ₯Ό 기본적으둜 μ œκ³΅ν•˜κ³  있음. 즉, 기본적으둜 λ‚΄μž₯된 ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€λ₯Ό μ‚¬μš©ν•˜μ—¬ 맀번 같은 κΈ°λŠ₯을 μˆ˜ν–‰ν•˜λŠ” ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€λ₯Ό 직접 λ§Œλ“œλŠ” λ²ˆκ±°λ‘œμ›€μ„ μ€„μ—¬μ€Œ.

package codeStates;

public class LambdaExample {
    public static void main(String[] args) {
        SumFunction s = (n1, n2) -> n1 + n2;
        System.out.println(s.sum(2,3));

    }

    @FunctionalInterface
    interface SumFunction{
        int sum(int num1, int num2);
    }
}

 

 

 

β“λ©”μ„œλ“œ 레퍼런슀

λ©”μ„œλ“œ μ°Έμ‘°λŠ” λžŒλ‹€μ‹μ—μ„œ λΆˆν•„μš”ν•œ λ§€κ°œλ³€μˆ˜λ₯Ό μ œκ±°ν•  λ•Œ 주둜 μ‚¬μš©, 즉 λžŒλ‹€μ‹μœΌλ‘œ λ”μš± 간단해진 읡λͺ… 객체λ₯Ό λ”μš± 더 κ°„λ‹¨ν•˜κ²Œ μ‚¬μš©ν•˜κ³  싢은 개발자의 λ‹ˆμ¦ˆκ°€ 반영된 μ‚°λ¬Ό. (클래슀 이름 :: λ©”μ„œλ“œ 이름) λ©”μ„œλ“œ 참쑰도 λžŒλ‹€μ‹κ³Ό λ§ˆμ°¬κ°€μ§€λ‘œ μΈν„°νŽ˜μ΄μŠ€μ˜ 읡λͺ… κ΅¬ν˜„ 객체둜 μƒμ„±λ˜λ―€λ‘œ μΈν„°νŽ˜μ΄μŠ€μ˜ 좔상 λ©”μ„œλ“œκ°€ μ–΄λ–€ λ§€κ°œλ³€μˆ˜λ₯Ό κ°€μ§€κ³ , 리턴 νƒ€μž…μ΄ 무엇이냐에 따라 달라짐.

정적 λ©”μ†Œλ“œ, μΈμŠ€ν„΄μŠ€ λ©”μ†Œλ“œλ₯Ό μ°Έμ‘°ν•˜λŠ” 경우)

//λ©”μ„œλ“œ 레퍼런슀(μ°Έμ‘°) : λžŒλ‹€μ‹μ—μ„œ λΆˆν•„μš”ν•œ λ§€κ°œλ³€μˆ˜λ₯Ό μ œκ±°ν•  λ•Œ 주둜 μ‚¬μš©
//클래슀 이름 :: λ©”μ„œλ“œ 이름 (정적, μΈμŠ€ν„΄μŠ€ λ©”μ„œλ“œλ₯Ό μ°Έμ‘°ν•  수 있고, μƒμ„±μž 참쑰도 κ°€λŠ₯)
IntBinaryOperator operator;

//정적 λ©”μ†Œλ“œ
operator=Calculator::staticMethod;
System.out.println("정적 λ©”μ„œλ“œ κ²°κ³Ό : " + operator.applyAsInt(2, 3));//5

//μΈμŠ€ν„΄μŠ€ λ©”μ„œλ“œ
Calculator c = new Calculator();
operator = c::instanceMethod;
System.out.println("μΈμŠ€ν„΄μŠ€ λ©”μ„œλ“œ κ²°κ³Ό : " + operator.applyAsInt(2, 3));//6

μƒμ„±μž μ°Έμ‘°ν•˜λŠ” 경우)

package codeStates.lambda;

import java.util.function.BiFunction;
import java.util.function.Function;

//λ©”μ„œλ“œ 레퍼런슀 -> μƒμ„±μž μ°Έμ‘°
class Member{
    private String name;
    private String id;

    public Member(){
        System.out.println("Member() μ‹€ν–‰");
    }

    public Member(String id){
        System.out.println("Member(String id) μ‹€ν–‰");
        this.id=id;
    }

    public Member(String name, String id){
        System.out.println("Member(String name, String id) μ‹€ν–‰");
        this.name=name;
        this.id=id;
    }
    public String getName(){
        return name;
    }
    public String getId(){
        return id;
    }

}
public class LambdaExample2 {
    public static void main(String[] args) throws Exception {
        /*
            μƒμ„±μž μ°Έμ‘° 문법
            클래슀 :: new

            Interface Function<T,R>
            T : type of input (arguments)
            R : tyep of result (return ~)

            Interface BiFunctioin<T,U,R>
            T : type of the first argument to the function
            U : type of the second argument to the function
            R : type of the result of the function
         */
        Function<String, Member> function1 = Member::new;
        Member member1 = function1.apply("kimcoding");//Member(String id) μ‹€ν–‰

        BiFunction<String, String, Member> function2 = Member::new;
        Member member2 = function2.apply("kimcoding", "κΉ€μ½”λ”©");//Member(String name, String id) μ‹€ν–‰

    }

}

 

 

 

 

❓Streamμ΄λž€?

μŠ€νŠΈλ¦Όμ΄λž€ λ°°μ—΄, μ»¬λ ‰μ…˜μ˜ μ €μž₯ μš”μ†Œλ₯Ό ν•˜λ‚˜μ”© μ°Έμ‘°ν•΄μ„œ λžŒλ‹€μ‹μœΌλ‘œ μ²˜λ¦¬ν•  수 μžˆλ„λ‘ ν•΄μ£ΌλŠ” 반볡자. μŠ€νŠΈλ¦Όμ„ μ‚¬μš©ν•˜λ©΄ List, Set, Map, λ°°μ—΄ λ“± λ‹€μ–‘ν•œ 데이터 μ†ŒμŠ€λ‘œλΆ€ν„° μŠ€νŠΈλ¦Όμ„ λ§Œλ“€ 수 있고, 이λ₯Ό ν‘œμ€€ν™”λœ λ°©λ²•μœΌλ‘œ λ‹€λ£° 수 있음

 

 

 

 

❓Stream의 핡심 νŠΉμ§•, μ™œ μ‚¬μš©ν•˜λŠ”κ°€?

기쑴의 forλ¬Έμ΄λ‚˜ Iteratorλ₯Ό μ‚¬μš©ν•˜λŠ” 경우, μ½”λ“œκ°€ κΈΈκ³  λ³΅μž‘ν•΄μ§. μŠ€νŠΈλ¦Όμ„ μ‚¬μš©ν•˜λ©΄ μ„ μ–Έν˜• ν”„λ‘œκ·Έλž˜λ° λ°©μ‹μœΌλ‘œ 데이터λ₯Ό μ²˜λ¦¬ν•  수 μžˆμ–΄ μΈκ°„μΉœν™”μ μ΄κ³  μ§κ΄€μ μœΌλ‘œ μ½”λ“œ μž‘μ„±μ΄ κ°€λŠ₯함. 또, κΈ°μ‘΄ λ°©μ‹μœΌλ‘œ 데이터λ₯Ό μ²˜λ¦¬ν•˜λŠ” κ²½μš°μ—λŠ” 데이터 μ†ŒμŠ€λ₯Ό 각기 λ‹€λ₯Έ λ°©μ‹μœΌλ‘œ 닀뀄야 ν•˜μ§€λ§Œ, μŠ€νŠΈλ¦Όμ„ μ‚¬μš©ν•˜λ©΄ 데이터 μ†ŒμŠ€κ°€ 무엇이냐에 관계없이 같은 λ°©μ‹μœΌλ‘œ 데이터λ₯Ό 가곡, μ²˜λ¦¬ν•  수 있음. 

 

 

 

 

❓λͺ…λ Ήν˜• ν”„λ‘œκ·Έλž˜λ° vs μ„ μ–Έν˜• ν”„λ‘œκ·Έλž˜λ°

package codeStates.stream;

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

//λͺ…λ Ήν˜• ν”„λ‘œκ·Έλž˜λ° vs μ„ μ–Έν˜• ν”„λ‘œκ·Έλž˜λ°
public class DeclaritiveProgrammingExample {
    public static void main(String[] args) {
        List<Integer> numbers = List.of(1, 2, 4, 5, 6, 8);

        //λͺ…λ Ήν˜• ν”„λ‘œκ·Έλž˜λ° : 직접 λͺ¨λ“  μš”μ†Œλ₯Ό μˆœνšŒν•˜λ©° μž‘μ—… μˆ˜ν–‰
        int sum=0;
        for(int number:numbers){
            if(number > 4 && (number%2==0)) sum += number;
        }

        System.out.println("λͺ…λ Ήν˜• ν”„λ‘œκ·Έλž˜λ°μ„ μ‚¬μš©ν•œ 합계 : "+sum);

        //μ„ μ–Έν˜• ν”„λ‘œκ·Έλž˜λ° : λ‚΄λΆ€κ°€ μ–΄λ–»κ²Œ λ™μž‘ν•˜λŠ” μ§€ λͺ°λΌλ„ μ–΄λ–€ μ½”λ“œκ°€ μ–΄λ–€ 역할을 ν•˜λŠ”μ§€ μ§κ΄€μ μœΌλ‘œ νŒŒμ•… κ°€λŠ₯
        System.out.println("μ„ μ–Έν˜• ν”„λ‘œκ·Έλž˜λ°μ„ μ‚¬μš©ν•œ 합계 : " +
                        numbers.stream()
                        .filter(number->number>4 && (number%2==0))
                        .mapToInt(number->number).sum()
        );

    }
}

 

 

 

 

β“μŠ€νŠΈλ¦Όμ˜ νŠΉμ§•

1. 슀트림 처리 과정은 생성, 쀑간 μ—°μ‚°, μ΅œμ’… μ—°μ‚° μ„Έ λ‹¨κ³„μ˜ νŒŒμ΄ν”„ 라인으둜 ꡬ성

2. μŠ€νŠΈλ¦Όμ€ 원본 데이터 μ†ŒμŠ€λ₯Ό λ³€κ²½ν•˜μ§€ μ•ŠμŒ (read-only) -> μŠ€νŠΈλ¦Όμ€ κ·Έ 원본이 λ˜λŠ” 데이터 μ†ŒμŠ€μ˜ 데이터듀을 λ³€κ²½ν•˜μ§€ μ•ŠμŒ. 였직 데이터λ₯Ό μ½μ–΄μ˜¬ 수 있고, 데이터에 λŒ€ν•œ λ³€κ²½κ³Ό μ²˜λ¦¬λŠ” μƒμ„±λœ 슀트림 μ•ˆμ—μ„œλ§Œ μˆ˜ν–‰λ¨.

3. μŠ€νŠΈλ¦Όμ€ μΌνšŒμš©μ΄λ‹€.(onetime-only) -> 슀트림이 μƒμ„±λ˜κ³ , 쀑간 연산을 거쳐 μ΅œμ’…μ—°μ‚°μ΄ μˆ˜ν–‰λ˜κ³  λ‚œ ν›„μ—λŠ” μŠ€νŠΈλ¦Όμ€ λ‹«νžˆκ³  μž¬μ‚¬μš© λΆˆκ°€.

4. μŠ€νŠΈλ¦Όμ€ λ‚΄λΆ€ λ°˜λ³΅μžμ΄λ‹€. -> μŠ€νŠΈλ¦Όμ€ μ»¬λ ‰μ…˜ 내뢀에 데이터 μš”μ†Œ 처리 방법(λžŒλ‹€μ‹)을 μ£Όμž…μ‹œμΌœμ„œ μš”μ†Œλ₯Ό 반볡 처리.

 

 

 

 

β“μŠ€νŠΈλ¦Όμ˜ 생성

- λ°°μ—΄ 슀트림 생성

- μ»¬λ ‰μ…˜ 슀트림 생성

- μž„μ˜μ˜ 수 슀트림 생성

 

 

 

 

❓배열 슀트림 생성

package codeStates.stream;

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

//λ°°μ—΄ 슀트림 생성
public class ArraysStreamExample {
    public static void main(String[] args) {
        //λ¬Έμžμ—΄ λ°°μ—΄ μ„ μ–Έ 및 ν• λ‹Ή
        String[] arr = new String[]{"κΉ€μ½”λ”©", "μ΄μžλ°”", "박해컀"};

        //λ¬Έμžμ—΄ 슀트림 생성 -> 두 κ°€μ§€ 방법 Arrays.stream(), Stream.of()
//        Stream<String> stream = Arrays.stream(arr);
        Stream<String> stream = Stream.of(arr);

        //좜λ ₯
        stream.forEach(System.out::println);

        //Arrays ν΄λž˜μŠ€μ—λŠ” κΈ°λ³Έν˜• 배열을 데이터 μ†ŒμŠ€λ‘œ μŠ€νŠΈλ¦Όμ„ μƒμ„±ν•˜λŠ” λ©”μ„œλ“œλ„ 있음
        //IntStream, DoubleStream, LongStream -> μˆ«μžμ™€ κ΄€λ ¨λœ μœ μš©ν•œ λ©”μ„œλ“œλ“€ μ •μ˜λ˜μ–΄ 있음.
        double[] doubleArr = {1.0, 2.0, 3.2};
        DoubleStream doubleStream = Arrays.stream(doubleArr);
        double average = doubleStream.average().getAsDouble();


        //IntStream의 μœ μš©ν•œ κΈ°λŠ₯λ“€
        //int λ°°μ—΄λ‘œ 슀트림 생성
        int[] intArr = {1, 2, 3, 4, 5, 6};
        IntStream intStream = Arrays.stream(intArr);

        //μˆ«μžμ™€ κ΄€λ ¨λœ 경우 intStream을 μ‚¬μš©ν•˜λŠ” 것을 ꢌμž₯
        System.out.println("sum="+intStream.sum());
//        System.out.println("average="+intStream.average()); -> sum() λ©”μ„œλ“œ 호좜 ν›„ stream이 λ‹«νžˆκΈ° λ•Œλ¬Έμ—  μ—λŸ¬ λ°œμƒ

    }
}

 

 

 

 

β“μ»¬λ ‰μ…˜ 슀트림 생성

package codeStates.stream;

import java.util.*;
import java.util.stream.Stream;

//μ»¬λ ‰μ…˜ 슀트림 생성
/*
    μ»¬λ ‰μ…˜ μ΅œμƒμœ„ 클래슀인 Collection에 μ •μ˜λœ stream() λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•˜μ—¬ 슀트림 생성 κ°€λŠ₯
 */
public class CollectionStreamExample {
    public static void main(String[] args) {
        List<Integer> list = Arrays.asList(1, 2, 3, 4);
        Stream<Integer> stream = list.stream();
        stream.forEach(System.out::print);

        System.out.println();

        Map<String, Integer> map=new HashMap<>();
        map.put("James", 12);
        map.put("Tomas", 10);
        map.put("Amy", 9);
        map.put("Sara", 8);
        Set<Map.Entry<String,Integer>> entrySet = map.entrySet();
        //μ˜€λ¦„μ°¨μˆœ
        entrySet.stream()
                .sorted(Map.Entry.comparingByValue())
                .forEach(e -> System.out.printf("key : " + e.getKey() + " value : " + e.getValue()+"\n"));
        //λ‚΄λ¦Όμ°¨μˆœ
        entrySet.stream()
                .sorted((a,b)-> b.getValue() - a.getValue())
                .forEach(e -> System.out.printf("key : " + e.getKey() + " value : " + e.getValue()+"\n"));
    }
}

 

 

 

 

β“μž„μ˜μ˜ 수 슀트림 생성

package codeStates.stream;

import java.util.Random;
import java.util.stream.DoubleStream;
import java.util.stream.IntStream;

//μž„μ˜μ˜ 수 슀트림 생성
public class RandomNumberStreamExample {
    public static void main(String[] args) {
        //λ¬΄ν•œμœΌλ‘œ λ‚œμˆ˜ 생성 -> infinite stream
//        IntStream ints = new Random().ints();

        //1. limit으둜 슀트림의 μ‚¬μ΄μ¦ˆλ₯Ό μ „λ‹¬ν•΄μ„œ κ·Έ λ²”μœ„ μ œν•œ -> 생성할 수의 갯수λ₯Ό 5개둜 μ œν•œ
        IntStream ints = new Random().ints(5);
        //IntStream ints=new Ranodom().ints().limit(5);
        ints.forEach(System.out::println);

        System.out.println("-".repeat(60));

        DoubleStream doubles = new Random().doubles(10);//10개둜 μ œν•œ
        doubles.forEach(System.out::println);



        //2.νŠΉμ • λ²”μœ„μ˜ μ •μˆ˜ : range(), rangeClose() -> 생성할 수의 κ°’μ˜ λ²”μœ„λ₯Ό μ œν•œ
        IntStream intStream1 = IntStream.rangeClosed(1, 10); //-> λλ²ˆν˜Έκ°€ ν¬ν•¨λ˜μ–΄ 1~10κΉŒμ§€μ˜ 숫자 좜λ ₯
        IntStream intStream2 = IntStream.range(1, 10); // -> 끝번호 ν¬ν•¨λ˜μ§€ μ•Šμ•„ 1~9κΉŒμ§€ 좜λ ₯.
        intStream1.forEach(e-> System.out.print(e+" "));//1 2 3 4 5 6 7 8 9 10
        intStream2.forEach(e-> System.out.print(e+" "));//1 2 3 4 5 6 7 8 9

    }
}

 

 

 

 

β“μŠ€νŠΈλ¦Όμ˜ 쀑간 μ—°μ‚°

슀트림의 쀑간 μ—°μ‚°μžμ˜ κ²°κ³ΌλŠ” μŠ€νŠΈλ¦Όμ„ λ°˜ν™˜ν•˜κΈ° λ•Œλ¬Έμ— μ—¬λŸ¬ 개의 μ—°μ‚°μžλ₯Ό μ—°κ²°ν•˜μ—¬ μ›ν•˜λŠ” 데이터 처리 μˆ˜ν–‰ κ°€λŠ₯

- 필터링

- λ§€ν•‘

- μ •λ ¬

package codeStates.stream;

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

//슀트림의 쀑간 μ—°μ‚°
public class StreamIntermediateOperationExample {
    public static void main(String[] args) {
        //1. distince : 쀑볡 제거
        List<String> names = Arrays.asList("κΉ€μ½”λ”©", "μ΄μžλ°”", "김해컀","κΉ€μ½”λ”©","박해컀");
        names.stream()
                .distinct()
                .forEach(element-> System.out.print(element+" "));//κΉ€μ½”λ”© μ΄μžλ°” 김해컀 박해컀
        System.out.println("\n"+"-".repeat(60));

        //2. filter : 쑰건(λžŒλ‹€μ‹ Predicate)에 λ§žλŠ” λ°μ΄ν„°λ“€λ§Œ μ •μ œν•˜μ—¬ 더 μž‘μ€ μ»¬λ ‰μ…˜ λ§Œλ“€μ–΄λƒ„
        names.stream()
                .filter(element -> element.startsWith("κΉ€"))
                .forEach(element -> System.out.print(element+" "));//κΉ€μ½”λ”© 김해컀 κΉ€μ½”λ”©

        System.out.println("\n"+"-".repeat(60));


        names.stream()
                .distinct()
                .filter(element -> element.startsWith("κΉ€"))
                .forEach(element -> System.out.print(element+" "));//κΉ€μ½”λ”© 김해컀

        System.out.println("\n"+"-".repeat(60));

        //2. map : μ›ν•˜λŠ” ν•„λ“œλ§Œ μΆ”μΆœν•˜κ±°λ‚˜ νŠΉμ • ν˜•νƒœλ‘œ λ³€ν™˜ν•  λ•Œ μ‚¬μš©
        List<String> students = Arrays.asList("Amy", "James", "Sara");
        students.stream()
                .map(element -> element.toUpperCase())
                .forEach(System.out :: print); //AMYJAMESSARA

        System.out.println("\n"+"-".repeat(60));

        List<Integer> list = Arrays.asList(1, 2, 3);
        System.out.println(list.stream()
                .map(n->n*3)
                .mapToInt(e->e)
                .average().getAsDouble());

        System.out.println("-".repeat(60));

        //flatMap() : 쀑첩 ꡬ쑰λ₯Ό μ œκ±°ν•˜κ³  단일 μ»¬λ ‰μ…˜μœΌλ‘œ λ§Œλ“€μ–΄μ€Œ.
        String[][] namesArray = new String[][]{{"박해컀", "μ΄μžλ°”"}, {"κΉ€μ½”λ”©", "λ‚˜λ°•μ‚¬"}};
        //κΈ°μ‘΄ 방식
        Arrays.stream(namesArray)
                .map(e-> Arrays.stream(e))
                .forEach(name -> name.forEach(System.out::print));//λ°•ν•΄μ»€μ΄μžλ°”κΉ€μ½”λ”©λ‚˜λ°•μ‚¬

        System.out.println("\n"+"-".repeat(60));

        //flatMap
        Arrays.stream(namesArray).
                flatMap(Arrays::stream)
                .forEach(System.out::print);//λ°•ν•΄μ»€μ΄μžλ°”κΉ€μ½”λ”©λ‚˜λ°•μ‚¬

        System.out.println("\n"+"-".repeat(60));

        //3.sorted() : ()μ•ˆμ— ComparatorλΌλŠ” μΈν„°νŽ˜μ΄μŠ€μ— μ •μ˜λœ static λ©”μ„œλ“œ or default λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•˜μ—¬ κ°„νŽΈν•˜κ²Œ μ •λ ¬
        List<String> animals = Arrays.asList("Tiger", "Lion", "Monkey", "Duck");

        //μΈμžκ°’ μ—†λŠ” sort() 호좜 -> μ˜€λ¦„μ°¨μˆœμœΌλ‘œ μ •λ ¬
        animals.stream().sorted().forEach(System.out::print);//DuckLionMonkeyTiger

        System.out.println("\n"+"-".repeat(60));

        //μ—­μˆœμœΌλ‘œ μ •λ ¬
        animals.stream().sorted(Comparator.reverseOrder()).forEach(System.out::print);//TigerMonkeyLionDuck

        System.out.println("\n"+"-".repeat(60));

        //λ¬Έμžμ—΄ 길이순으둜 μ •λ ¬(μ˜€λ¦„μ°¨μˆœ)
        animals.stream().sorted((a,b)->a.length()-b.length()).forEach(System.out::print);//LionDuckTigerMonkey

        System.out.println("\n"+"-".repeat(60));

        //4.skip(int n) : n개의 숫자λ₯Ό κ±΄λ„ˆλ›°κ³ 
        IntStream intStream1 = IntStream.rangeClosed(1, 10);
        intStream1.skip(5).forEach(System.out::print);//678910

        System.out.println("\n"+"-".repeat(60));


        //5.limit(int n) : n개의 μˆ«μžκΉŒμ§€
        IntStream intStream2 = IntStream.rangeClosed(1, 10);
        intStream2.limit(5).forEach(System.out::print);//12345

        System.out.println("\n"+"-".repeat(60));


        //6.peek(action) : μš”μ†Œλ“€μ„ μˆœνšŒν•˜λ©° νŠΉμ • μž‘μ—…(action) μˆ˜ν–‰
        IntStream intStream3 = IntStream.of(1,2,3,4,5);
        int sum=intStream3.filter(e->e%2==0)
                .peek(System.out::print)
                .sum();
        System.out.println("합계 : "+sum);//24ν•©κ²Œ : 6 -> 짝수만 ν•„ν„°λ§ν•΄μ„œ 합계 κ΅¬ν•˜κΈ°




    }
}

 

 

 

 

β“μŠ€νŠΈλ¦Ό μ΅œμ’… μ—°μ‚°

- κΈ°λ³Έ 집계

- λ§€μΉ­

- μš”μ†Œ μ†Œλͺ¨

- μš”μ†Œ μˆ˜μ§‘

-기타

package codeStates.stream;

import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.OptionalDouble;
import java.util.stream.Collectors;

//슀트림 μ΅œμ’… μ—°μ‚°
public class StreamTerminalOperation {
    public static void main(String[] args) {
        //1.κΈ°λ³Έ 집계
        int[] intArray = {1, 2, 3, 4, 5};

        //μΉ΄μš΄νŒ…
        long count= Arrays.stream(intArray).count();
        System.out.println("count : " + count);

        //합계
        long sum = Arrays.stream(intArray).sum();
        System.out.println("sum : " + sum);

        //평균
        double average = Arrays.stream(intArray).average().getAsDouble();
        System.out.println("average : " + average);

        //평균 -> getAsDouble()은 μ΅œμ’… μ—°μ‚°κ³ΌλŠ” 관계 μ—†λ‹€! μžλ£Œν˜•μ„ λ³€ν™˜ν•΄μ€„ 뿐
        OptionalDouble average2 = Arrays.stream(intArray).average();
        System.out.println(average2);//OptionalDouble[3.0]
        double result = average2.getAsDouble();
        System.out.println("average2 : "+result);//average2 : 3.0


        //μ΅œλŒ€κ°’
        int max = Arrays.stream(intArray).max().getAsInt();
        System.out.println("max : " +max);

        //μ΅œμ†Œκ°’
        int min = Arrays.stream(intArray).min().getAsInt();
        System.out.println("min : " + min);

        //λ°°μ—΄μ˜ 첫 번째 μš”μ†Œ
        int first = Arrays.stream(intArray).findFirst().getAsInt();
        System.out.println("first element : "+first);

        System.out.println("-".repeat(60));

        //2.λ§€μΉ­ : 쑰건식 λžŒλ‹€ Predicateλ₯Ό λ§€κ°œλ³€μˆ˜λ‘œ λ„˜κ²¨ 슀트림의 각 데이터 μš”μ†Œλ“€μ΄ νŠΉμ • 쑰건을 λ§Œμ‘±ν•˜λŠ”μ§€ μ—¬λΆ€λ₯Ό boolean으둜 리턴
        int[] intArray2 = {2, 4, 6};

        //allMatch()
        boolean isAllEven=Arrays.stream(intArray2).allMatch(e->e%2==0);
        System.out.println("μš”μ†Œ λͺ¨λ‘ 2의 λ°°μˆ˜μΈκ°€? " + isAllEven);//true

        //noneMatch()
        boolean isAllNotEven=Arrays.stream(intArray2).noneMatch(e->e%2==0);
        System.out.println("μš”μ†Œ λͺ¨λ‘ 2의 λ°°μˆ˜κ°€ μ•„λ‹Œκ°€? "+isAllNotEven);//false

        //anyMatch()
        boolean isAnyEven = Arrays.stream(intArray2).anyMatch(e -> e % 2 == 0);
        System.out.println("μš”μ†Œ 쀑 ν•˜λ‚˜λΌλ„ 2의 λ°°μˆ˜κ°€ μžˆλŠ”κ°€? "+isAnyEven);//true

        System.out.println("-".repeat(60));

        //3. reduce() : 슀트림의 μš”μ†Œλ₯Ό μ€„μ—¬λ‚˜κ°€λ©΄μ„œ μ—°μ‚°μœΌ μˆ˜ν–‰ν•˜κ³  μ΅œμ’… κ²°κ³Ό λ°˜ν™˜
        int[] intArray3 = {1, 2, 3, 4, 5};

        //μ΄ˆκΈ°κ°’μ΄ μ—†λŠ” reduce()
        int sum2 = Arrays.stream(intArray3)
                .map(e -> e * 2)
                .reduce((a, b) -> a + b)
                .getAsInt();
        System.out.println("μ΄ˆκΈ°κ°’μ΄ μ—†λŠ” reduce() : " + sum2);

        //μ΄ˆκΈ°κ°’μ΄ μžˆλŠ” reduce()
        int sum3=Arrays.stream(intArray3)
                .map(e->e*2)
                .reduce(5, (a,b)->a+b);
        System.out.println("μ΄ˆκΈ°κ°’μ΄ μžˆλŠ” reduce() : " + sum3);

        System.out.println("-".repeat(60));


        //4.collect() : 슀트림 μš”μ†Œλ“€μ„ List, Set, Map λ“± λ‹€λ₯Έ νƒ€μž…μ˜ 결과둜 μˆ˜μ§‘ν•˜κ³  싢은 경우.
        List<Student> totalList = Arrays.asList(
                new Student("κΉ€μ½”λ”©", 100, Student.Gender.Male),
                new Student("박해컀", 90, Student.Gender.Male),
                new Student("μ΄μžλ°”", 80, Student.Gender.Female),
                new Student("κΉ€μžλ°”", 100, Student.Gender.Male),
                new Student("λ°•μžλ°”", 70, Student.Gender.Female)

        );

        //슀트링 μ—°μ‚° κ²°κ³Όλ₯Ό Map으둜 λ³€ν™˜
        Map<String, Integer> maleMap = totalList.stream()
                .filter(s -> s.getGender() == Student.Gender.Male)
                .collect(Collectors.toMap(
                        student -> student.getName(),
                        student -> student.getScore()
                ));
        System.out.println(maleMap);//{κΉ€μ½”λ”©=100, κΉ€μžλ°”=100, 박해컀=90}

        //슀트링 μ—°μ‚° κ²°κ³Όλ₯Ό List둜 λ³€ν™˜
        List<String> femaleList=totalList.stream()
                .filter(s->s.getGender()==Student.Gender.Female)
                .map(e->e.toString())
                .collect(Collectors.toList());

        System.out.println(femaleList);//[μ΄μžλ°”'s score : 80 Gender : Female, λ°•μžλ°”'s score : 70 Gender : Female]
    }
}

class Student{
    public enum Gender {Male, Female};
    private String name;
    private int score;
    private Gender gender;

    public Student(final String name, final int score, final Gender gender) {
        this.name = name;
        this.score = score;
        this.gender = gender;
    }

    public String getName() {
        return this.name;
    }

    public int getScore() {
        return this.score;
    }

    public Gender getGender() {
        return this.gender;
    }

    @Override
    public String toString() {
        return getName() + "'s score : " + getScore() + " Gender : " + getGender();
    }
}