관리 메뉴

Partially Committed

[CH14] Lambda & Stream λ³Έλ¬Έ

πŸ’» Study !/JAVA

[CH14] Lambda & Stream

WonderJay 2022. 9. 3. 16:45
728x90
λ°˜μ‘ν˜•
SMALL

λ³Έ ν¬μŠ€νŒ…μ€ μžλ°”μ˜ 정석 ꡐ재λ₯Ό κ³΅λΆ€ν•˜λ©°, κ°„λ‹¨νžˆ 정리/기둝 μš©λ„λ‘œ μž‘μ„±ν•˜μ˜€μŠ΅λ‹ˆλ‹€. ν˜Ήμ—¬, 잘λͺ»λœ λ‚΄μš©μ΄ μžˆλ‹€λ©΄ μ§€μ ν•΄μ£Όμ‹œλ©΄ κ°μ‚¬ν•˜κ² μŠ΅λ‹ˆλ‹€.

 

 


1. Lambda expression

  λžŒλ‹€μ‹μ΄ JDK1.8 μ΄ν›„λ‘œ μΆ”κ°€λ˜λ©΄μ„œ 객체지ν–₯언어인 μžλ°”μ—μ„œλ„ ν•¨μˆ˜ν˜• μ–Έμ–΄μ˜ μž₯점을 μ‚¬μš©ν•  수 있게 λ˜μ—ˆλ‹€. Lambda expression 은 method λ₯Ό ν•˜λ‚˜μ˜ expression 으둜 ν‘œν˜„ν•œ κ²ƒμœΌλ‘œ, Lamdba expression(μ΄ν•˜ λžŒλ‹€μ‹)을 μ‚¬μš©ν•˜λ©΄ method 의 이름과 λ°˜ν™˜κ°’μ„ μž‘μ„±ν•  ν•„μš”κ°€ μ—†μ–΄ λžŒλ‹€μ‹μ„ 읡λͺ… ν•¨μˆ˜(anonymous function) 이라고 λΆ€λ₯΄κΈ°λ„ ν•œλ‹€.

 

int method() { return (int)Math.random()*5) + 1; } // before

Arrays.setAll(arr, (i) -> (int)(Math.random() * 5) = 1);  // Lambda

 

λžŒλ‹€μ‹μ΄ λ„μž…λ˜λ©΄μ„œ method λ₯Ό 마치 λ³€μˆ˜μ²˜λŸΌ λ‹€λ£° 수 있게 λ˜μ—ˆλ‹€. 

(λ§€κ°œλ³€μˆ˜ μ„ μ–Έ) -> { // do something } κ³Ό 같이 μ„ μ–Έν•  수 μžˆλ‹€.

 

 

[ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€ ; Functional Interface]

  μžλ°”μ—μ„œ λͺ¨λ“  λ©”μ„œλ“œλŠ” ν΄λž˜μŠ€μ— ν¬ν•¨λ˜μ–΄μ•Ό ν•˜λŠ”λ°, 읡λͺ… 클래슀의 객체와 같은 λžŒλ‹€μ‹μ€ ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€λ₯Ό 톡해 λ‹€λ£° 수 μžˆλ‹€. λ‹€λ§Œ ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€λŠ” 였직 ν•˜λ‚˜μ˜ abstract method 만 μ •μ˜λ˜μ–΄μžˆμ–΄μ•Ό ν•˜λ©°, static λ©”μ„œλ“œμ™€ default λ©”μ„œλ“œλŠ” 자유둭게 μ •μ˜ν•  수 μžˆλ‹€. μ• λ„ˆν…Œμ΄μ…˜ @FunctionalInterface λ₯Ό 뢙이면, ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€λ₯Ό 잘 μ •μ˜ν•˜μ˜€λŠ”μ§€ κ²€μ‚¬ν•΄μ£Όλ―€λ‘œ μœ„ μ• λ„ˆν…Œμ΄μ…˜μ„ ν™œμš©ν•˜λ„λ‘ ν•˜μž. κΈ°μ‘΄μ—λŠ” μΈν„°νŽ˜μ΄μŠ€μ˜ λ©”μ„œλ“œλ₯Ό κ΅¬ν˜„ν•˜λ €λ©΄ μ•„λž˜μ™€ 같이 μž‘μ„±ν•˜μ˜€λ‹€.

 

List<String> list = Arrays.asList("abc", "aaa);

Collections.sort(list, new Comparator<String>() {

     public int compare(String s1, String s2) {

                      return s2.compareTo(s1);

              }

  };

 

이제 λžŒλ‹€μ‹μ„ ν™œμš©ν•˜μ—¬ μ•„λž˜μ™€ 같이 ν•  수 μžˆλ‹€.

 

List<String> list = Arrays.asList("abc", "aaa);

Collections.sort(list, (s1, s2) -> s2.compareTo(s1));

 

 

[ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€ νƒ€μž…μ˜ λ§€κ°œλ³€μˆ˜μ™€ λ°˜ν™˜νƒ€μž…]

λ§Œμ•½ MyFunction 이 μ•„λž˜μ™€ 같이 μ •μ˜λ˜μ–΄ μžˆλ‹€λ©΄,

@FunctionalInterface

interface MyFunction {

        void myMethod();

}

void aMethod(MyFunction f) {

        f.myMethod();

}

 

aMethod 의 λ§€κ°œλ³€μˆ˜κ°€ ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€ νƒ€μž…μ΄λ―€λ‘œ λžŒλ‹€μ‹μ„ μ°Έμ‘°ν•˜λŠ” μ°Έμ‘°λ³€μˆ˜λ₯Ό λ§€κ°œλ³€μˆ˜λ‘œ 지정해야 ν•œλ‹€.

κ·Έλž˜μ„œ μ•„λž˜μ™€ 같이 μ‚¬μš©ν•˜κ±°λ‚˜,

 

MyFunction f = () -> System.out.println("myMethod()");

aMethod(f);

 

ν˜Ήμ€ μ°Έμ‘°λ³€μˆ˜ 없이,

 

aMethod( ()->System.out.println("myMethod()") );

 

라고 μ‚¬μš©ν•  수 μžˆλ‹€.

 

@FunctionalInterface
interface MyFunction{
    void run();
}
class source{
    static void execute(MyFunction f){
        f.run();
    }
    static MyFunction getMyFunction(){
        MyFunction f = ()-> System.out.println("f3.run()");
        return f;
    }

    public static void main(String[] args) {
        MyFunction f1 = ()-> System.out.println("f1.run()");
        MyFunction f2 = new MyFunction() {
            @Override
            public void run() {
                System.out.println("f2.run()");
            }
        } ;
        MyFunction f3 = getMyFunction();

        f1.run();
        f2.run();
        f3.run();

        execute(f1);
        execute( ()-> System.out.println("run()") );
    }
}

[λžŒλ‹€μ‹μ˜ νƒ€μž…κ³Ό ν˜•λ³€ν™˜]

  ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€λ‘œ λžŒλ‹€μ‹μ„ μ°Έμ‘°ν•  수 μžˆμ§€λ§Œ λžŒλ‹€μ‹μ˜ νƒ€μž…μ΄ ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€μ™€ κ°™λ‹€λŠ” 것은 μ•„λ‹ˆλ©°, λžŒλ‹€μ‹μ€ 읡λͺ… 객체이닀.(읡λͺ… κ°μ²΄λŠ” νƒ€μž…μ„ μ»΄νŒŒμΌλŸ¬κ°€ μ •ν•˜λŠ”λ° μ •ν™•νžˆ μ•Œ 수 μ—†μŒ. λžŒλ‹€μ‹μ˜ 경우 'μ™ΈλΆ€ν΄λž˜μŠ€μ΄λ¦„$$Lambda$번호' 와 같은 ν˜•μ‹μœΌλ‘œ λ˜μ–΄μžˆμŒ.) κ·Έλž˜μ„œ μ•„λž˜μ™€ 같이 ν˜•λ³€ν™˜μ΄ ν•„μš”ν•˜λ‹€.

 

MyFunction f = (MyFunction) (()->{}));

 

λ‹€λ§Œ μœ„ ν˜•λ³€ν™˜μ€ μƒλž΅μ΄ κ°€λŠ₯ν•˜λ‹€. μœ μ˜ν•  점은 λžŒλ‹€μ‹μ€ 였직 ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€λ‘œλ§Œ ν˜•λ³€ν™˜μ΄ κ°€λŠ₯ν•˜λ©°, Object νƒ€μž…μœΌλ‘œ ν˜•λ³€ν™˜ν•  μˆ˜λŠ” μ—†λ‹€. ( ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€λ‘œ λ³€ν™˜ν•œ 뒀에 λ³€ν™˜ν•˜λ©΄ κ°€λŠ₯ν•˜κΈ°λŠ” ν•˜λ‹€.) 

 

 

[μ»¬λ ‰μ…˜ ν”„λ ˆμž„μ›Œν¬μ™€ ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€]

import java.util.AbstractList;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;

class source{
    public static void main(String[] args) {
        AbstractList<Integer> list = new ArrayList<>();
        for (int i = 0; i < 10 ; i++) {
            list.add(i);
        }
        // list 의 λͺ¨λ“  μš”μ†Œ 좜λ ₯
        list.forEach(i-> System.out.printf(i+","));
        System.out.println();

        // list μ—μ„œ 2 ν˜Ήμ€ 3의 배수 제거
        list.removeIf(x->x%2==0||x%3==0);
        System.out.println(list);

        //list 의 각 μš”μ†Œμ— 10을 곱함
        list.replaceAll(i->i*10);
        System.out.println(list);

        Map<String, String> map = new HashMap<>();
        map.put("1", "1");
        map.put("2", "2");
        map.put("3", "3");
        map.put("4", "4");

        // map 의 λͺ¨λ“  μš”μ†Œλ₯Ό key, value ν˜•νƒœλ‘œ 좜λ ₯
        map.forEach((k, v)-> System.out.println("{" + k + "," + v + "}"));
        System.out.println();
    }
}

  λžŒλ‹€μ‹μ„ μ‚¬μš©ν•  λ•Œ, ν•΄λ‹Ή λžŒλ‹€μ‹μ΄ ν•˜λ‚˜μ˜ λ©”μ„œλ“œλ§Œ ν˜ΈμΆœν•œλ‹€λ©΄ ν΄λž˜μŠ€μ΄λ¦„::λ©”μ„œλ“œμ΄λ¦„ ν˜Ήμ€ μ°Έμ‘°λ³€μˆ˜::λ©”μ„œλ“œμ΄λ¦„ 으둜 λ°”κΏ€ 수 μžˆλ‹€.

 

2. 슀트림(stream)

  μŠ€νŠΈλ¦Όμ΄λž€,,

 

 


References

http://www.yes24.com/Product/Goods/24259565

 

Java의 정석 - YES24

졜근 7λ…„λ™μ•ˆ μžλ°” λΆ„μ•Όμ˜ 베슀트 μ…€λŸ¬ 1μœ„λ₯Ό μ§€μΌœμ˜¨ `μžλ°”μ˜ 정석`의 μ΅œμ‹ νŒ. μ €μžκ°€ μΉ΄νŽ˜μ—μ„œ 12λ…„κ°„ 직접 λ…μžλ“€μ—κ²Œ 닡변을 ν•΄μ˜€λ©΄μ„œ μ΄ˆλ³΄μžκ°€ μ–΄λ €μ›Œν•˜λŠ” 뢀뢄을 잘 νŒŒμ•…ν•˜κ³  μ“΄ μ±…. 뿐만 μ•„

www.yes24.com

 

 

728x90
λ°˜μ‘ν˜•
LIST
Comments