[JAVA] LAMBDA

์„ฑ์žฅ์ผ๊ธฐยท2024๋…„ 7์›” 26์ผ
0

[SWCAMP] JAVA

๋ชฉ๋ก ๋ณด๊ธฐ
15/16

๋žŒ๋‹ค

๐Ÿช„ ๋žŒ๋‹ค์‹์€ JAVA 8 ๋ฒ„์ „์— ์ƒˆ๋กœ ์ถ”๊ฐ€๋œ ๊ธฐ๋Šฅ์œผ๋กœ ๋ฉ”์†Œ๋“œ๋ฅผ ํ•˜๋‚˜์˜ ์‹(expression)์œผ๋กœ ํ‘œํ˜„ํ•œ ๊ฒƒ์ด๋‹ค.
๋ฉ”์†Œ๋“œ๋ฅผ ๋žŒ๋‹ค์‹์œผ๋กœ ํ‘œํ˜„ํ•˜๋ฉด ๋ฉ”์†Œ๋“œ ์ด๋ฆ„๊ณผ ๋ฆฌํ„ด๊ฐ’์ด ์—†์–ด์„œ ์ต๋ช… ํ•จ์ˆ˜๋ผ๊ณ ๋„ ํ•  ์ˆ˜ ์žˆ๋‹ค.

  • ๋žŒ๋‹ค์‹์€ ์•Œ๋ก ์กฐ ์ฒ˜์น˜(Alonzo Church) ๋ผ๋Š” ์ˆ˜ํ•™์ž๊ฐ€ 1936๋…„์— ๋ฐœํ‘œํ•œ ๋žŒ๋‹ค ๊ณ„์‚ฐ๋ฒ•์— ๊ธฐ์ดˆํ•˜๊ณ  ์žˆ๋‹ค.
  • ๊ทธ๋ ‡๋‹ค๋ฉด ๋จผ์ € ์ˆ˜ํ•™์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๋žŒ๋‹ค ๊ณ„์‚ฐ๋ฒ•์— ๋Œ€ํ•ด ๊ฐ„๋‹จํžˆ ์•Œ์•„๋ณด์ž.
f(x, y) = x * y
  • ์œ„์˜ ์‹์€ x์™€ y์˜ ๊ณฑ์„ ํ‘œํ˜„ํ•˜๋Š” ํ•จ์ˆ˜ f๋‹ค. ์ด๋ฅผ ๋žŒ๋‹ค์‹์œผ๋กœ ๋ณ€๊ฒฝํ•˜๋ฉด ์•„๋ž˜์™€ ๊ฐ™์•„์ง„๋‹ค.
(x, y) -> x * y
  • โ€˜=โ€™ ์ด โ†’ ๋กœ ๋ฐ”๋€Œ๊ฒŒ ๋˜๊ณ  f ๊ฐ€ ์‚ฌ๋ผ์ง„ ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค. ์ฆ‰, ํ•จ์ˆ˜ ์ด๋ฆ„์„ ๋นผ๊ณ  โ†’ ์ดํ›„๋กœ ์‹์ด ๋ฐ”๋กœ ์˜ค๊ฒŒ ๋œ๋‹ค.

  • โ€œ๋ฉ”์†Œ๋“œ์˜ ์ด๋ฆ„๊ณผ ๋ฐ˜ํ™˜๊ฐ’์ด ์—†์–ด์ง„๋‹คโ€ ๋Š” ์˜๋ฏธ๋Š” ์ต๋ช… ํ•จ์ˆ˜๋ฅผ ์˜๋ฏธํ•œ๋‹ค.

๋žŒ๋‹ค์‹์ด ํ•„์š”ํ•œ ์ด์œ 

  • ๋žŒ๋‹ค์‹์˜ ๊ฐ€์žฅ ํฐ ์žฅ์ ์€ ๋‹จ์ˆœํ•จ ๊ทธ๋ฆฌ๊ณ  ํŽธํ•จ์ด๋‹ค.

  • ์ต์ˆ™ํ•˜์ง€ ์•Š์€ ํ‘œํ˜„์‹๊ณผ ์‚ฌ์šฉ๋ฒ•์— ์ฒ˜์Œ์—๋Š” ์–ด๋ ค์šธ ์ˆ˜ ์žˆ์œผ๋‚˜,

  • ๋žŒ๋‹ค์‹์„ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ๋˜๋ฉด ์ปฌ๋ ‰์…˜, ์ŠคํŠธ๋ฆผ์„ ์—ฐ๊ณ„ํ•ด์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์‰ฝ๊ฒŒ ์กฐ์ž‘ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค.

  • ๋˜ํ•œ ๋ถˆํ•„์š”ํ•˜๊ฒŒ ๋ฐ˜๋ณต๋˜๋Š” ์ฝ”๋“œ๋„ ์ œ๊ฑฐํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค.

  • ๋Ÿฌ๋‹์ปค๋ธŒ๊ฐ€ ์กด์žฌํ•˜๊ณ  ํ˜ธ๋ถˆํ˜ธ๊ฐ€ ๋งŽ์ด ๊ฐˆ๋ฆฌ๊ณ  ์žˆ์œผ๋‚˜ ๋ฐฐ์šด ์ดํ›„ ์‚ฌ์šฉํ•˜๊ฒŒ ๋œ๋‹ค๋ฉด, ๋žŒ๋‹ค์‹์œผ๋กœ ๋ฐ”๊พธ๊ณ  ์‹ถ์€ ์ƒ๊ฐ์ด ๋ถˆ์‘ฅ๋ถˆ์‘ฅ ๋‚˜๊ฒŒ ๋  ๊ฒƒ์ด๋‹ค.

๋žŒ๋‹ค ํ‘œํ˜„์‹

// ๋งค๊ฐœ ๋ณ€์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ
() -> { ... }

// ๋งค๊ฐœ ๋ณ€์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ
(ํƒ€์ž… ๋งค๊ฐœ๋ณ€์ˆ˜, ...) -> { ... }
  • ๋žŒ๋‹ค ํ‘œํ˜„์‹์—์„œ ๋งค๊ฐœ ๋ณ€์ˆ˜ ํƒ€์ž…์€ ๋Ÿฐํƒ€์ž„ ์‹œ์— ์ž๋™์œผ๋กœ ์ธ์‹๋˜๊ธฐ ๋•Œ๋ฌธ์— ๋งค๊ฐœ๋ณ€์ˆ˜ ํƒ€์ž…์„ ์ผ๋ฐ˜์ ์œผ๋กœ ์–ธ๊ธ‰ํ•˜์ง€ ์•Š์•„๋„ ๋œ๋‹ค.

  • ํ•˜๋‚˜์˜ ๋งค๊ฐœ๋ณ€์ˆ˜๋งŒ ์กด์žฌํ•˜๋Š” ๊ฒฝ์šฐ ( ) ๋Š” ์ƒ๋žตํ•  ์ˆ˜ ์žˆ๋‹ค. ์‹คํ–‰๋ฌธ์ด ํ•˜๋‚˜์ธ ๊ฒฝ์šฐ์— { } ๋Š” ์ƒ๋žต ๊ฐ€๋Šฅํ•˜๋‹ค.

ํ•จ์ˆ˜์  ์ธํ„ฐํŽ˜์ด์Šค(@FunctionalInterface)

  • ์ž๋ฐ”์—์„œ๋Š” ๋ฉ”์†Œ๋“œ๋ฅผ ๋”ฐ๋กœ ์„ ์–ธํ•  ์ˆ˜ ์—†๋‹ค. ๋ฉ”์†Œ๋“œ๋Š” ํ•ญ์ƒ ํด๋ž˜์Šค์˜ ๋‚ด๋ถ€์—์„œ๋งŒ ์„ ์–ธ๋˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฉ”์†Œ๋“œ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•ด์•ผ ํ•œ๋‹ค.

  • ๋”ฐ๋ผ์„œ ๋žŒ๋‹ค์‹์€ ๋‹จ๋…์œผ๋กœ ์„ ์–ธํ•  ์ˆ˜ ์—†๋‹ค. ๋žŒ๋‹ค์‹์€ ์ต๋ช… ํด๋ž˜์Šค์ฒ˜๋Ÿผ ์ธํ„ฐํŽ˜์ด์Šค ๋ณ€์ˆ˜์— ๋Œ€์ž…๋œ๋‹ค.

  • ์ธํ„ฐํŽ˜์ด์Šค๋Š” ์ง์ ‘ ๊ฐ์ฒดํ™” ํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— ๊ตฌํ˜„ ํด๋ž˜์Šค๊ฐ€ ํ•„์š”ํ•œ๋ฐ ๋žŒ๋‹ค์‹์„ ํ†ตํ•ด ์ต๋ช… ๊ตฌํ˜„ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

  • ๋žŒ๋‹ค์‹์ด ๋Œ€์ž…๋  ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋žŒ๋‹ค์‹์˜ ํƒ€๊นƒ ํƒ€์ž…์ด๋ผ๊ณ  ํ•œ๋‹ค.

  • ํ•˜์ง€๋งŒ ๋ชจ๋“  ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ๋žŒ๋‹ค์‹์˜ ํƒ€๊นƒ ํƒ€์ž…์ด ๋  ์ˆœ ์—†๋‹ค.

  • ๋žŒ๋‹ค์‹์€ ํ•˜๋‚˜์˜ ๋ฉ”์†Œ๋“œ๋ฅผ ์ •์˜ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋‘ ๊ฐœ ์ด์ƒ์˜ ์ถ”์ƒ ๋ฉ”์†Œ๋“œ๊ฐ€ ์„ ์–ธ๋œ ์ธํ„ฐํŽ˜์ด์Šค๋Š” ๋žŒ๋‹ค์‹์„ ์ด์šฉํ•ด ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์—†๋‹ค.

  • ์ฆ‰, ํ•˜๋‚˜์˜ ์ถ”์ƒ ๋ฉ”์†Œ๋“œ๊ฐ€ ์„ ์–ธ๋œ ์ธํ„ฐํŽ˜์ด์Šค๋งŒ ๋žŒ๋‹ค์‹์˜ ํƒ€๊นƒ ํƒ€์ž…์ด ๋  ์ˆ˜ ์žˆ๋‹ค.

  • ์ด๋Ÿฌํ•œ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํ•จ์ˆ˜์  ์ธํ„ฐํŽ˜์ด์Šค(functional interface)๋ผ๊ณ  ํ•œ๋‹ค.

  • ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ๋‘ ๊ฐœ ์ด์ƒ์˜ ์ถ”์ƒ ๋ฉ”์†Œ๋“œ๊ฐ€ ์„ ์–ธ๋˜์—ˆ๋Š”์ง€ ์ฒดํฌํ•ด์ฃผ๋Š” ์–ด๋…ธํ…Œ์ด์…˜์ด ์žˆ๋‹ค.

  • @FunctionalInterface ์–ด๋…ธํ…Œ์ด์…˜์ด๋‹ค. ์ด ์–ด๋…ธํ…Œ์ด์…˜์€ ์˜ต์…˜์ด๋‹ค. ์—†์–ด๋„ ์ถ”์ƒ ๋ฉ”์†Œ๋“œ ํ•˜๋‚˜๋งŒ ์žˆ์œผ๋ฉด ํ•จ์ˆ˜์  ์ธํ„ฐํŽ˜์ด์Šค๋กœ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๋‹ค.

@FunctionalInterface
public interface MyFunction {
    public void methodA();
    public void methodB();  // Error
}
  • ์ž๋ฐ” 8์—์„œ๋Š” ๋นˆ๋ฒˆํ•˜๊ฒŒ ์‚ฌ์šฉ๋˜๋Š” ํ•จ์ˆ˜์  ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ java.util.function ํ‘œ์ค€ API ํŒจํ‚ค์ง€๋กœ ์ œ๊ณตํ•œ๋‹ค.

  • ํฌ๊ฒŒ Consumer, Supplier, Function, Operator, Predicate ๋กœ ๊ตฌ๋ถ„๋œ๋‹ค.

Consumer

  • Consumer ํ•จ์ˆ˜์  ์ธํ„ฐํŽ˜์ด์Šค์˜ ํŠน์ง•์€ ๋ฆฌํ„ด ๊ฐ’์ด ์—†๋Š” accept() ๋ฉ”์†Œ๋“œ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.

  • accept() ๋ฉ”์†Œ๋“œ๋Š” ๋‹จ์ง€ ๋งค๊ฐœ ๋ณ€์ˆ˜๋กœ ๋„˜์–ด์˜จ ๊ฐ’์„ ์†Œ๋น„ํ•˜๋Š” ์—ญํ• ๋งŒ ํ•œ๋‹ค. ์†Œ๋น„ํ•œ๋‹ค๋Š” ๊ฒƒ์€ ๋ฆฌํ„ด๊ฐ’์ด ์—†๋‹ค๋Š” ๋ง์ด๋‹ค.

์ธํ„ฐํŽ˜์ด์Šค ๋ช…์ถ”์ƒ ๋ฉ”์†Œ๋“œ์„ค๋ช…
Consumervoid accept(T t)๊ฐ์ฒด T๋ฅผ ๋ฐ›์•„์„œ ์†Œ๋น„ํ•œ๋‹ค.
BiConsumer<T, U>void accept(T t, U u)๊ฐ์ฒด T, U๋ฅผ ๋ฐ›์•„ ์†Œ๋น„ํ•œ๋‹ค.
intConsumervoid accept(int value)int ๊ฐ’์„ ๋ฐ›์•„ ์†Œ๋น„ํ•œ๋‹ค.
DoubleConsumervoid accept(double value)double ๊ฐ’์„ ๋ฐ›์•„ ์†Œ๋น„ํ•œ๋‹ค.
LongConsumervoid accept(long value)long ๊ฐ’์„ ๋ฐ›์•„ ์†Œ๋น„ํ•œ๋‹ค.
ObjIntConsumervoid accept(T t, int value)๊ฐ์ฒด T์™€ int ๊ฐ’์„ ๋ฐ›์•„ ์†Œ๋น„ํ•œ๋‹ค.
ObjDoubleConsumervoid accept(T t, double value)๊ฐ์ฒด T์™€ double ๊ฐ’์„ ๋ฐ›์•„ ์†Œ๋น„ํ•œ๋‹ค.
ObjLongConsumervoid accept(T t, long value)๊ฐ์ฒด T์™€ long ๊ฐ’์„ ๋ฐ›์•„ ์†Œ๋น„ํ•œ๋‹ค.
Consumer<String> consumer = str -> System.out.println(str + "์ด(๊ฐ€) ์ž…๋ ฅ๋จ");
consumer.accept("Hello?");

BiConsumer<String , LocalTime> biConsumer =
         (str,time) -> System.out.println(str + "์ด(๊ฐ€) " + time + "์— ์ž…๋ ฅ๋จ");
biConsumer.accept("Hello?", LocalTime.now());

ObjIntConsumer<Random> objectIntConsumer =
         (random,bound) -> System.out.println("0๋ถ€ํ„ฐ" + bound + "์ „ ๊นŒ์ง€์˜ ๋‚œ์ˆ˜ ๋ฐœ์ƒ" + random.nextInt(bound));
objectIntConsumer.accept(new Random(),10);
}
  • ์‹คํ–‰๊ฒฐ๊ณผ
    Hello?์ด(๊ฐ€) ์ž…๋ ฅ๋จ
    Hello?์ด(๊ฐ€) 18:09:23.022936800์— ์ž…๋ ฅ๋จ
    0๋ถ€ํ„ฐ10์ „ ๊นŒ์ง€์˜ ๋‚œ์ˆ˜ ๋ฐœ์ƒ1

Supplier

  • Supplier ํ•จ์ˆ˜์  ์ธํ„ฐํŽ˜์ด์Šค๋Š” ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์—†๊ณ  ๋ฆฌํ„ด ๊ฐ’์ด ์žˆ๋Š” getXXX() ๋ฉ”์†Œ๋“œ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.

  • ์ด ๋ฉ”์†Œ๋“œ๋Š” ์‹คํ–‰ ๋˜๋ฉด ํ˜ธ์ถœํ•œ ๊ณณ์œผ๋กœ ๊ฐ’์„ ๋ฆฌํ„ดํ•ด์ค€๋‹ค.

์ธํ„ฐํŽ˜์ด์Šค ๋ช…์ถ”์ƒ ๋ฉ”์†Œ๋“œ์„ค๋ช…
SupplierT get()T ๊ฐ์ฒด๋ฅผ ๋ฆฌํ„ดํ•œ๋‹ค.
BooleanSupplierBoolean getAsBoolean()Boolean ๊ฐ’์„ ๋ฆฌํ„ดํ•œ๋‹ค.
IntSupplierint getAsInt()int ๊ฐ’์„ ๋ฆฌํ„ดํ•œ๋‹ค.
DoubleSupplierdouble getAsDouble()double ๊ฐ’์„ ๋ฆฌํ„ดํ•œ๋‹ค.
LongSuplierlong getAsLong()long ๊ฐ’์„ ๋ฆฌํ„ดํ•œ๋‹ค.
public static void main(String[] args) {

Supplier<LocalDateTime> supplier = () -> LocalDateTime.now();
        System.out.println(supplier.get());

        BooleanSupplier booleanSupplier = () -> {
            int random = (int)(Math.random() * 2);
            return random == 0? false : true;
        };
        System.out.println("๋žœ๋ค true or false: " +booleanSupplier.getAsBoolean());
}
  • ์‹คํ–‰๊ฒฐ๊ณผ
    2024-01-26T18:14:42.105426900
    ๋žœ๋ค true or false: false

Function

  • Function ํ•จ์ˆ˜์  ์ธํ„ฐํŽ˜์ด์Šค์˜ ํŠน์ง•์€ ๋งค๊ฐœ๋ณ€์ˆ˜์™€ ๋ฆฌํ„ด๊ฐ’์ด ์žˆ๋Š” applyXXX() ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.
  • ์ด ๋ฉ”์†Œ๋“œ๋“ค์€ ๋งค๊ฐœ ๋ณ€์ˆ˜ ํƒ€์ž…๊ณผ ๋ฆฌํ„ด ํƒ€์ž…์— ๋”ฐ๋ผ์„œ ๋‹ค์–‘ํ•œ ๋ฉ”์†Œ๋“œ๋“ค์ด ์žˆ๋‹ค.
์ธํ„ฐํŽ˜์ด์Šค ๋ช…์ถ”์ƒ ๋ฉ”์†Œ๋“œ์„ค๋ช…
Function <T, R>R apply(T t)๊ฐ์ฒด T๋ฅผ ๊ฐ์ฒด R๋กœ ๋งคํ•‘ํ•œ๋‹ค.
BiFunction <T, U, R>R apply(T t, U u)๊ฐ์ฒด T์™€ U๋ฅผ ๊ฐ์ฒด R๋กœ ๋งคํ•‘ํ•œ๋‹ค.
IntFunctionR apply(int value)int๋ฅผ ๊ฐ์ฒด R๋กœ ๋งคํ•‘ํ•œ๋‹ค.
IntToDoubleFunctiondouble applyAsDouble(int value)int๋ฅผ double๋กœ ๋งคํ•‘ํ•œ๋‹ค.
IntToLongFunctionlong applyAsLong(int value)int๋ฅผ long์œผ๋กœ ๋งคํ•‘ํ•œ๋‹ค.
DoubleFunctionR apply(double value)double์„ ๊ฐ์ฒด R๋กœ ๋งคํ•‘ํ•œ๋‹ค.
LongToDoubleFunctiondouble applyAsDouble(long value)long์„ double๋กœ ๋งคํ•‘ํ•œ๋‹ค.
LongToIntFunctionint applyAsInt(long value)long์„ int๋กœ ๋งคํ•‘ํ•œ๋‹ค.
ToDoubleBiFunction<T, U>double applyAsDouble(T t, U u)๊ฐ์ฒด T์™€ U๋ฅผ double๋กœ ๋งคํ•‘ํ•œ๋‹ค.
ToDoubleFunctiondouble applyAsDouble(T value)๊ฐ์ฒด T๋ฅผ double๋กœ ๋งคํ•‘ํ•œ๋‹ค.
ToIntBiFunction<T, U>int applyAsInt(T t, U u)๊ฐ์ฒด T์™€ U๋ฅผ int๋กœ ๋งคํ•‘ํ•œ๋‹ค.
ToIntFunctionint applyAsInt(T t)๊ฐ์ฒด T๋ฅผ int๋กœ ๋งคํ•‘ํ•œ๋‹ค.
ToLongBiFunction<T, U>long applyAsLong(T t, U u)๊ฐ์ฒด T์™€ U๋ฅผ long์œผ๋กœ ๋งคํ•‘ํ•œ๋‹ค.
ToLongFunctionlong applyAsLong(T t)๊ฐ์ฒด T๋ฅผ long์œผ๋กœ ๋งคํ•‘ํ•œ๋‹ค.
public static void main(String[] args) {

Function<String, Integer> function = str -> Integer.valueOf(str);
        String strValue = "12345";
        System.out.println(function.apply(strValue));

        BiFunction<String,String ,Integer> biFunction =
        (str1,str2) -> Integer.valueOf(str1) + Integer.valueOf(str2);
        System.out.println(biFunction.apply("12345","11111")
}
  • ์‹คํ–‰๊ฒฐ๊ณผ
    12345
    23456

Operator

  • Operator ํ•จ์ˆ˜์  ์ธํ„ฐํŽ˜์ด์Šค๋Š” Function ๊ณผ ๋˜‘๊ฐ™์ด ์ž‘๋™ํ•œ๋‹ค. ๋งค๊ฐœ๋ณ€์ˆ˜์™€ ๋ฆฌํ„ด๊ฐ’์ด ์žˆ๋Š” applyXXX() ๋ฉ”์†Œ๋“œ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.

  • Function ๊ณผ ๋‹ค๋ฅธ ์ ์€ ๋งค๊ฐœ๋ณ€์ˆ˜์™€ ๋™์ผํ•œ ํƒ€์ž…์œผ๋กœ ๋ฆฌํ„ด์„ ํ•œ๋‹ค.

์ธํ„ฐํŽ˜์ด์Šค ๋ช…์ถ”์ƒ ๋ฉ”์†Œ๋“œ์„ค๋ช…
BinaryOperatorBiFunction<T, U, R>์˜ ํ•˜์œ„ ์ธํ„ฐํŽ˜์ด์ŠคT์™€ U๋ฅผ ์—ฐ์‚ฐํ•˜์—ฌ R๋กœ ๋ฆฌํ„ดํ•œ๋‹ค.
UnaryOperatorFunction<T, R> ์˜ ํ•˜์œ„ ์ธํ„ฐํŽ˜์ด์ŠคT๋ฅผ ์—ฐ์‚ฐํ•œ ํ›„ R๋กœ ๋ฆฌํ„ดํ•œ๋‹ค.
DoubleBinaryOperatordouble applyAsDouble(double, double)๋งค๊ฐœ๋ณ€์ˆ˜ ๋‘ ๊ฐœ๋ฅผ ํ™œ์šฉํ•˜์—ฌ double ํƒ€์ž…์œผ๋กœ ๋ฆฌํ„ดํ•œ๋‹ค.
DoubleUnaryOperatordouble applyAsDouble(double)๋งค๊ฐœ๋ณ€์ˆ˜ ํ•œ ๊ฐœ๋ฅผ ํ™œ์šฉํ•˜์—ฌ double ํƒ€์ž…์œผ๋กœ ๋ฆฌํ„ดํ•œ๋‹ค.
IntBinaryOperatorint applyAsInt(int, int)๋‘ ๊ฐœ์˜ int๋ฅผ ์—ฐ์‚ฐํ•˜์—ฌ int ํƒ€์ž…์œผ๋กœ ๋ฆฌํ„ดํ•œ๋‹ค
IntUnaryOperatorint applyAsInt(int)ํ•œ ๊ฐœ์˜ int๋ฅผ ์—ฐ์‚ฐํ•˜์—ฌ int ํƒ€์ž…์œผ๋กœ ๋ฆฌํ„ดํ•œ๋‹ค.
LongBinaryOperatorlong applyAsLong(long, long)๋‘ ๊ฐœ์˜ long์„ ์—ฐ์‚ฐํ•˜์—ฌ long ํƒ€์ž…์œผ๋กœ ๋ฆฌํ„ดํ•œ๋‹ค.
LongUnaryOperatorlong applyAsLong(long)ํ•œ ๊ฐœ์˜ long์„ ์—ฐ์‚ฐํ•˜์—ฌ long ํƒ€์ž…์œผ๋กœ ๋ฆฌํ„ดํ•œ๋‹ค.
public class LamdaEx {

    private static int[] intArr = {64, 90, 80, 92, 100};

    public static void main(String[] args) {

        int max = method((x, y) -> Math.max(x, y));
        System.out.println("๊ฐ€์žฅ ํฐ ๊ฐ’ : " + max);

        int min = method((x, y) -> Math.min(x, y));
        System.out.println("๊ฐ€์žฅ ์ž‘์€ ๊ฐ’ : " + min);

    }

    public static int method(IntBinaryOperator intBinaryOperator){

        int result = intArr[0];

        for (int val : intArr){
            result = intBinaryOperator.applyAsInt(result, val);
        }

        return result;

    }

}
  • ์‹คํ–‰๊ฒฐ๊ณผ
    ๊ฐ€์žฅ ํฐ ๊ฐ’ : 100
    ๊ฐ€์žฅ ์ž‘์€ ๊ฐ’ : 64

Predicate

  • Predicate ํ•จ์ˆ˜์  ์ธํ„ฐํŽ˜์ด์Šค๋Š” ๋งค๊ฐœ ๋ณ€์ˆ˜์™€ boolean ๋ฆฌํ„ด ๊ฐ’์ด ์žˆ๋Š” testXXX() ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.

  • ์ด ๋ฉ”์†Œ๋“œ๋“ค์€ ๋งค๊ฐœ๋ณ€์ˆ˜ ๊ฐ’์„ ์ด์šฉํ•ด true ๋˜๋Š” false ๋ฅผ ๋ฆฌํ„ดํ•˜๋Š” ์—ญํ• ์„ ํ•œ๋‹ค.

์ธํ„ฐํŽ˜์ด์Šค ๋ช…์ถ”์ƒ ๋ฉ”์†Œ๋“œ์„ค๋ช…
PredicateBoolean test(T t)๊ฐ์ฒด T๋ฅผ ์กฐ์‚ฌํ•˜์—ฌ true, false๋ฅผ ๋ฆฌํ„ดํ•œ๋‹ค.
BiPredicate<T, U>Boolean test(T t, U u)๊ฐ์ฒด T์™€ U๋ฅผ ์กฐ์‚ฌํ•˜์—ฌ true, false๋ฅผ ๋ฆฌํ„ดํ•œ๋‹ค.
DoublePredicateBoolean test(double value)double ๊ฐ’์„ ์กฐ์‚ฌํ•˜์—ฌ true, false๋ฅผ ๋ฆฌํ„ดํ•œ๋‹ค.
IntPredicateBoolean test(int value)int ๊ฐ’์„ ์กฐ์‚ฌํ•˜์—ฌ true, false๋ฅผ ๋ฆฌํ„ดํ•œ๋‹ค.
LongPredicateBoolean test(long value)long ๊ฐ’์„ ์กฐ์‚ฌํ•˜์—ฌ true, false๋ฅผ ๋ฆฌํ„ดํ•œ๋‹ค.
public static void main(String[] args) {

    int[] intArr = {90, 67, 87, 99, 100};

    int testCut = 80;

    IntPredicate intPredicate = number -> number >= testCut;
    
    for(int num : intArr){
        if(intPredicate.test(num)){
            System.out.println(num + " ์€ " + testCut + " ๋ณด๋‹ค ๋†’์œผ๋ฏ€๋กœ ํ•ฉ๊ฒฉ");
        }
        else {
            System.out.println(num + " ์€ " + testCut + " ๋ณด๋‹ค ๋‚ฎ์œผ๋ฏ€๋กœ ๋ถˆํ•ฉ๊ฒฉ");
        }
    }
    
}
  • ์‹คํ–‰๊ฒฐ๊ณผ
    90 ์€ 80 ๋ณด๋‹ค ๋†’์œผ๋ฏ€๋กœ ํ•ฉ๊ฒฉ
    67 ์€ 80 ๋ณด๋‹ค ๋‚ฎ์œผ๋ฏ€๋กœ ๋ถˆํ•ฉ๊ฒฉ
    87 ์€ 80 ๋ณด๋‹ค ๋†’์œผ๋ฏ€๋กœ ํ•ฉ๊ฒฉ
    99 ์€ 80 ๋ณด๋‹ค ๋†’์œผ๋ฏ€๋กœ ํ•ฉ๊ฒฉ
    100 ์€ 80 ๋ณด๋‹ค ๋†’์œผ๋ฏ€๋กœ ํ•ฉ๊ฒฉ

๋ฉ”์†Œ๋“œ ์ฐธ์กฐ

  • ๋ฉ”์†Œ๋“œ ์ฐธ์กฐ(method reference)๋Š” ํ•จ์ˆ˜ํ˜• ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋žŒ๋‹ค์‹์ด ์•„๋‹Œ ์ผ๋ฐ˜ ๋ฉ”์†Œ๋“œ๋ฅผ ์ฐธ์กฐ์‹œ์ผœ ์„ ์–ธํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค.

  • ์ผ๋ฐ˜ ๋ฉ”์†Œ๋“œ๋ฅผ ์ฐธ์กฐํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” 3๊ฐ€์ง€ ์กฐ๊ฑด์„ ๋งŒ์กฑํ•ด์•ผํ•œ๋‹ค.

  • ํ•จ์ˆ˜ํ˜• ์ธํ„ฐํŽ˜์ด์Šค์˜ ๋งค๊ฐœ๋ณ€์ˆ˜ ํƒ€์ž…/๊ฐฏ์ˆ˜/๋ฐ˜ํ™˜ ํ˜•์ด๋ž‘ ๋ฉ”์†Œ๋“œ์˜ ๋งค๊ฐœ๋ณ€์ˆ˜ ํƒ€์ž…/๊ฐฏ์ˆ˜/๋ฐ˜ํ™˜ ํ˜•์ด ๊ฐ™์•„์•ผ ํ•œ๋‹ค.

๋งค๊ฐœ ๋ณ€์ˆ˜์˜ ๋ฉ”์†Œ๋“œ ์ฐธ์กฐ

  • ์œ„์—์„œ ์–ธ๊ธ‰ํ•œ ์ฐธ์กฐํ•  ๋ฉ”์†Œ๋“œ๊ฐ€ 3๊ฐ€์ง€ ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๋Š”์ง€ ํ™•์ธํ•œ๋‹ค.

  • ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์—†๊ณ  ๋ฐ˜ํ™˜ํ˜•์ด ๋™์ผํ•œ ๊ฒฝ์šฐ ๋ฉ”์†Œ๋“œ ์ฐธ์กฐ๋ฅผ ์ ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

๋ฉ”์†Œ๋“œ ์ฐธ์กฐ ํ‘œํ˜„์‹

ํด๋ž˜์Šค์ด๋ฆ„::๋ฉ”์†Œ๋“œ์ด๋ฆ„ (static)์ผ ๊ฒฝ์šฐ
์ฐธ์กฐ๋ณ€์ˆ˜์ด๋ฆ„::๋ฉ”์†Œ๋“œ์ด๋ฆ„ (non-static)์ผ ๊ฒฝ์šฐ

์ƒ์„ฑ์ž ์ฐธ์กฐ

  • ์ƒ์„ฑ์ž๋„ ๋ฉ”์†Œ๋“œ ์ฐธ์กฐ๋ฅผ ํ•  ์ˆ˜ ์žˆ๋‹ค. ์ƒ์„ฑ์ž๋Š” new ๋กœ ์ƒ์„ฑ์„ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํด๋ž˜์Šค์ด๋ฆ„::new ๋กœ ์ฐธ์กฐ ํ•ด์•ผํ•œ๋‹ค.

๋ฉ”์†Œ๋“œ ์ฐธ์กฐ ํ‘œํ˜„์‹

ํด๋ž˜์Šค์ด๋ฆ„::new
profile
์—”์ง€๋‹ˆ์–ด๋กœ์˜ ์„ฑ์žฅ์ผ์ง€

0๊ฐœ์˜ ๋Œ“๊ธ€