â ëë€ ííì(Lambda Expression) ì벜 ì 늬
ëë€ ííì (Lambda Expression)
ëë€ ííì(lambda expression)ìŽë íšìí íë¡ê·žëë°ì 구ì±íêž° ìí íšìììŽë©°, ê°ëší ë§íŽ ìë°ì ë©ìë륌 ê°ê²°í íšì ììŒë¡ ííí ê²ìŽë€.
ì§êžê¹ì§ ìë°ììë ë©ìë륌 íë íííë €ë©Ž íŽëì€ë¥Œ ì ìíŽìŒ íë€. íì§ë§ ëë€ììŒë¡ íííë©Ž ë©ìëì ìŽëŠê³Œ ë°íê°ì ìëµí ì ìê³ ìŽë¥Œ ë³ìì ë£ìŽ ìë° ìœëê° ë§€ì° ê°ê²°íŽì§ë ì¥ì ìŽ ìë€.
ìë 귞늌ìì 볎ë¯ìŽ int add(int a, int b) {} ë©ìë ííìì, ë©ìë íì
, ë©ìë ìŽëŠ, 맀ê°ë³ì íì
, ì€êŽíž, return 묞ì ìëµíê³ , íìŽí êž°ížë¥Œ ë£ììŒë¡ìš ìœë륌 íëª
ì ìŒë¡ íšì¶íìì 볌 ì ìë€. ìŽë¬í í¹ì§ìŒë¡ ëë€ìì ìŽëŠìŽ ìë íšì ìµëª
íšì(anonymous function) ëŒê³ ë íë€.
int add(int x, int y) {
return x + y;
}
// ìì ë©ìë륌 ëë€ ííìì ìŽì©íŽ ìëì ê°ìŽ ëšì¶ ìí¬ì ìë€. (ë©ìë ë°í íì
, ë©ìë ìŽëŠ ìëµ)
(int x, int y) -> {
return x + y;
};
// 맀ê°ë³ì íì
ë ìëµ í ì ìë€.
(x, y) -> {
return x + y;
};
// íšìì 늬íŽë¬ž íì€ë§ ìì ê²œì° ëì± ë ëšì¶ ìí¬ ì ìë€. (ì€êŽíž, return ìëµ)
(x, y) -> x + y;
íì ì ìëµì íŽë 컎íìŒë¬ê° ìë¬ë¥Œ ëì°ì§ìë ìŽì ë, 컎íìŒë¬ ëëŠëë¡ ìëµë íì ìì¹ë¥Œ ì¶ë¡ íì¬ ëìíê² íŽì£Œêž° ë묞ìŽë€.
ëë€ììŽ ì²ììë ììíê² ëê»Žì ž ì€íë € ê±°ë¶ê°ìŽ ë€ ì ìë€. íì§ë§ 묞ë²ìŽ íì ì ìŒë¡ ê°ê²°íŽ ì§ë ê²ë§íŒ, ëë€ìì ìµìíŽì§ë©Ž ê°ë ì± ë©Žìì í° ì¥ì ì ì»ê² ëë€. í¹í 컬ë ì (Collection)ì ìì륌 íí°ë§íê±°ë 맀ííì¬ ìíë 결곌륌 ìœê² ì»ì ì ìë€.
ëë€ì곌 ìë°ì€í¬ëŠœíž ìµëª íìŽí íšì
ë§ìŒ ìë°ë¥Œ ë°°ì°êž° ìì ìë°ì€í¬ëŠœíž íë¡ê·žëë°ì 뚌ì ë°°ìŽ ë
ì ë¶ë€ìŽëŒë©Ž ìë°ì ëë€ ííìì ìŽíŽíëë° ììŽ ë§€ì° ììí ê²ìŽë€. ì¬ì€ ìë°ì€í¬ëŠœížì ìµëª
íìŽí íšì ìì²Žê° ëë€ íšì ìŒì¢
ìŽêž° ë묞ìŽë€. êŽížë¥Œ ìëµíê±°ë ë± ëë€ì Ʞ볞 ë¬žë² ì²Žê³ë ìë°ì ìë°ì€í¬ëŠ¬ëž ëë€ ë¹ì·íë€. ëšì§ íìŽí 몚ììŽ => ì -> ë¡ ë€ë¥Œ ë¿ìŽë€.
ëë€ìì ìë°ì€í¬ëŠœíž ë¬žë² ííì ìë°ì ë¬žë² íí륌 ë¹êµíìë©Ž ìë ìœëì ê°ë€.
const MyFunction = {
print: function() {}
};
MyFunction.print = (str) => console.log(str);
let myfunc = MyFunction;
myfunc.print("Hello World");
interface MyFunction {
void print(String str);
}
public class Main {
public static void main(String[] args) {
MyFunction myfunc = (str) -> System.out.println(str);
myfunc.print("Hello World");
}
}
ë³ìì íšì륌 ëŽìë, ìë°ì€í¬ëŠœížë ìœíì ìžìŽëŒ íì ì êŽê³ììŽ ìì ë¡ê² ë°ì ì ìì§ë§, ìë° ê°ì ê²œì° ê°íì ìžìŽ ìŽêž° ë묞ì ë°ëì íšìì ëí íì ì ì ìžíì¬ìŒ íë€. íì§ë§ ìë°ìë 8ê°ì§ íì (primitive íì 곌 reference íì ) ë°ì ìêž° ë묞ì íšì ë°ìŽí° ì첎륌 ëŽìì ììë§í ìë£íìŽ ë±í ì í©í ê²ìŽ ìë€. ê·žëì ìë° ê°ë°ì§ë€ì ìží°íìŽì€ë¥Œ ìµëª 구í ê°ì²Ž íì ìŒë¡ìš, íšì륌 íŽë¹ ìží°íìŽì€ íì ìŒë¡ ë°ì ì ìê² ì€ê³í ê²ìŽë€.
ëë€ì곌 íšìí ìží°íìŽì€
ëë€ìì íí륌 볎멎 ë§ì¹ ìë°ì ë©ìë륌 ë³ìë¡ ì ìžíë ê² ì²ëŒ 볎ìŽì§ë§, ì¬ì€ ìë°ë ë©ìë륌 ëšë ìŒë¡ ì ìží ìë ìë€. ííë§ ê·žë ê² ë³ŽìŒ ë¿ìŽì§ ìœë륌 볎멎 ëë€ íšììì ë³ìì ëì íê³ ë³ììì ë©ìë륌 ížì¶íŽì ì¬ì©íë ê²ìŽ ë§ì¹ ê°ì²Žì ë€ëŠìŽ ìë€.
MyFunction myfunc = (str) -> System.out.println(str);
myfunc.print("Hello World");
ì¬ì€ ëë€ìë ê²°êµì ê°ì²ŽìŽë€. ì íí ë§íë©Ž ìží°íìŽì€ë¥Œ ìµëª íŽëì€ë¡ 구íí ìµëª 구í ê°ì²Žë¥Œ ì§§ê² ííí ê² ë¿ìŽë€.
ê°ì²Ž ì§í¥ ë°©ì vs ëë€ íí ë°©ì
ìŽì ëíŽì êž°ì¡Ž ìë°7ìì íí íë ê°ì²Ž ì§í¥ ë°©ì곌 ëë€ íí ë°©ìì ë¹êµíŽë³Žë©° ìŽíŽíŽë³Žì.
ë€ì IAdd ëŒë ìží°íìŽì€ê° ìê³ add() ì¶ì ë©ìëê° ìë€. ì°ëŠ¬ë ìŽ ìží°íìŽì€ë¥Œ 구ííì¬ ë©ìë륌 ì ìíŽ ë§ì
êž°ë¥ì ìŽì©í ìì ìŽë€.
êž°ì¡Žìë ìží°íìŽì€ë¥Œ íŽëì€ì implements íê³ ì€ë²ëŒìŽë©íì¬ ì¬ì©íŽ ìë€.
interface IAdd {
int add(int x, int y);
}
class Add implements IAdd {
public int add(int x, int y) {
return x + y;
}
}
public class Main {
public static void main(String[] args) {
// ì íŽëì€ë¡ ë©ìë ì¬ì©íêž°
Add a = new Add();
int result1 = a.add(1, 2);
System.out.println(result1);
}
}
ë ëìê°ì íë²ë§ ì¬ì©íê³ ë²ë €ì§ íŽëì€ëŒë©Ž, êµ³ìŽ ë²ê±°ë¡ê² íŽëì€ë¥Œ ì ìžíì§ ë§ê³ ìµëª íŽëì€ë¡ ìŒíì© ì€ë²ëŒìŽë© íì¬ ì¬ì©íêž°ë íìë€.
interface IAdd {
int add(int x, int y);
}
public class Main {
public static void main(String[] args) {
// ìµëª
íŽëì€ë¡ ì ìíŽ ì¬ì©íêž° (ìŒíì©)
Iadd a = new IAdd() {
public int add(int x, int y) {
return x + y;
}
};
int result2 = a.add(1, 2);
System.out.println(result2);
}
}
ê·žëŠ¬ê³ ëë€ë ìŽ ìµëª íŽëì€ ìœë ë¶ë¶ì ì§§ê² ííí ê²ìŽë€.
interface IAdd {
int add(int x, int y);
}
public class Main {
public static void main(String[] args) {
// ëë€ ííììŒë¡ íšì¶ íêž°
IAdd lambda = (x, y) -> { return x + y; }; // ëë€ì ëì ìžë¯žìœë¡ ì ìì§ë§ì
int result3 = lambda.add(1, 2);
System.out.println(result3);
}
}
ëë€ì ê°ì²Žë¥Œ ìœìì ì¶ë ¥ íŽë³Žë©Ž, ìµëª
íŽëì€ íí íì곌 ëë€ë¥ž ìžë¶íŽëì€ëª
$$Lambda$ë²íž ì ê°ì ë
ìì ìž íí íìì ì§ëê³ ììì ì ì ìë€.
ìŠ, ì묎 íŽëì€ë ì¶ì íŽëì€ì ë©ìë륌 ëë€ììŒë¡ ì€ìŽê±°ë íë íìë 못íë€ëŒë ë»ìŽë€. ì€ë¡ì§ ìží°íìŽì€ë¡ ì ìží ìµëª 구í ê°ì²Žë§ìŽ ëë€ììŒë¡ ííìŽ ê°ë¥íë€. ê·žëŠ¬ê³ ëë€ ííìŽ ê°ë¥í ìŽë¬í ìží°íìŽì€ë¥Œ ê°ëŠ¬ìŒ íšìí ìží°íìŽì€ëŒ ìŽì¹íë€.
íšìí ìží°íìŽì€ ë?
íšìí ìží°íìŽì€ë ë± íëì ì¶ì ë©ìëê° ì ìžë ìží°íìŽì€ë¥Œ ë§íë€. ìì IAdd ìží°íìŽì€ ìì ìœëê° ë°ë¡ íšìí ìží°íìŽì€ ìŽë€. ê·žëŠ¬ê³ ëë€ìì íšìí ìží°íìŽì€ ìì ì ìë íëì ì¶ì ë©ìë ì ìžì ì§§ê² ííí ê²ìŽë€.
ìê°íŽë³Žë©Ž ëë€ì ìì²Žê° íëì ë©ìë륌 íì€ë¡ ì ìíë ííììŽêž° ë묞ì, ìží°íìŽì€ì ëê° ìŽì ì¶ì ë©ìëê° ë€ìŽììŒë©Ž ìŽë¥Œ ìœëë¡ ê²¹ì³ ííí ë°©ë²ìŽ ë¬ëŠ¬ ìêž° ë묞ì, ì€ë¡ì§ ì¶ì ë©ìë íê°ë§ ê°ì§ ìží°íìŽì€ê° ëë€ìì íê² íì (targe type)ìŽ ë ì ìë ê²ìŽë€.
ëš, Java 8 ë²ì ë¶í° ìŽì©ìŽ ê°ë¥í ìží°íìŽì€ì final ììë default, static, private ë©ìëë ì¶ì ë©ìëê° ìëêž° ë묞ì, ìŽë€ ì¬ë¬ê°ê° ìží°íìŽì€ì ë€ìŽììŽë ì€ë¡ì§ ì¶ì ë©ìëê° íê°ìŽë©Ž íšìí ìží°íìŽì€ë¡ ì·šêž ëë€.
// íšìí ìží°íìŽì€ê° ë ì ìë€.
interface IAdd {
int add(int x, int y);
}
// íšìí ìží°íìŽì€ê° ë ì ìë€.
interface ICalculate {
int add(int x, int y);
int min(int x, int y);
}
// 구ì±ììê° ë§ìë ê²°êµ ì¶ì ë©ìëë íê°ìŽêž° ë묞ì íšìí ìží°íìŽì€ìŽë€.
interface IAdd {
int add(int x, int y);
final boolean isNumber = true; // final ìì
default void print() {}; // ëíŽíž ë©ìë
static void print2() {}; // static ë©ìë
}
@FunctionalInterface
ëë§ì íšìì ìží°íìŽì€ë¥Œ ë§ë€ ë ë ê° ìŽìì ì¶ì ë©ìëê° ì ìžëì§ ìëë¡ ì»ŽíìŒë¬ê° checking íŽì£Œë êž°ë¥ìŽ ìëë°, ìží°íìŽì€ ì ìž ì @FunctionalInterface ìŽë
ží
ìŽì
ì ë¶ì¬ì£Œê² ëë€ë©Ž ë ê° ìŽìì ë©ìë ì ìž ì 컎íìŒ ì€ë¥ë¥Œ ë°ìììŒì€ë€. ìŽë ê°ë°ìì ì€ì륌 ì€ì¬ì£Œë ìí ì íë€.
@FunctionalInterface
public interface MyFunctional {
public void method();
public void otherMethod(); // 컎íìŒ ì€ë¥ ë°ì
}
ìŽë°ì íšìí ìží°íìŽì€ì ê°ë ì늬 ë° ìë°ìì ì ê³µíë íšìí ìží°íìŽì€ íì€ API ì¢ ë¥ì ëíŽì ììží ìŽíŽíê³ ì¶ë€ë©Ž ë€ì í¬ì€í ì ì°žê³ íêžž ë°ëë€.
ëë€ìì íì ì¶ë¡
ëë€ììŒë¡ ìœë륌 íì ì ìŒë¡ ì€ìŒ ì ìë€ë ì ì ììë€. ê·žë°ë° ëŠ¬íŽ íì ë íëŒë¯ží° íì ë ìë ëë€ìì 컎íìŒë¬ê° ìŽ íšìê° ìŽë€ íì íšììžì§ ìê³ ë¬žë²ì íì©íë ê²ìŒê¹?
ì¬ì€ 컎íìŒë¬ ì€ì€ë¡ ëë€ íšììì ë³Žê³ ì¶ë¡ íì¬ íì ì ì ì¶íêž° ë묞ì ê°ë¥í ê²ìŽë€. ë¬Žìš AI ì²ëŒ ì¶ë¡ í ì ëë ìëê³ ì¬ëìŽ ë¯žëŠ¬ ì ìíŽëì ì ì묞ì ë³Žê³ ì¶ë¡ íŽì£Œë ê²ìŽë€.
ìì ìì ë ì죌 ê°ëší ìì ìŽê³ , ëë¶ë¶ì íšìí ìží°íìŽì€ë¥Œ ìŽì©íê² ëë©Ž ì ë€ëŠ(Generics)ì ì¬ì©íê² ëëë°, 컎íìŒë¬ê° íì ì ì¶ë¡ íë ë° íìí íì ì 볎 ëë¶ë¶ì ì ë€ëŠìì íë³íì¬ ì»ëë€ê³ 볎멎 ëë€.
ë€ì ìœë륌 ëŽë³Žì. List ìë£íì ë§ë€ê³ 늬ì€ížì íì
íëŒë¯ží°ë¥Œ StringìŒë¡ ì§ì íìë€. ê·žëŠ¬ê³ Collections íŽëì€ì sort ë©ìë륌 ë¶ë¬ì 첫ë²ì§ž 맀ê°ë³ìë¡ë 늬ì€íž ê°ì²Žë¥Œ ëë²ì§ž 맀ê°ë³ìë¡ë ëë€ íšì륌 ì ë¬ íìë€.
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
public class Main {
public static void main(String[] args) {
List<String> words = Arrays.asList("aaa", "bbb", "ccc", "ddd");
Collections.sort(words, (s1, s2) -> Integer.compare(s1.length(), s2.length()));
}
}
ì°žê³ ë¡ ìëì Collections íŽëì€ì sort ë©ìë ì ì묞ì 볎멎, ëë€íšìì íšìí ìží°íìŽì€ íì
ì java.util.Comparator ë¡ ì§ì ëìŽ ììŒë©°, ëë€ì 맀ê°ë³ì íì
ì Comparator ìží°íìŽì€ì ì ë€ëŠ T íì
ìŒë¡ ì§ì ëìŽ ìë걞 볌 ì ìë€.
ìŽë¬í ííìì 컎íìŒë¬ê° íì ì ì ì¶íë ììë ë€ì곌 ê°ìŽ ëë€.
- sort ë©ìëì 첫ë²ì§ž 맀ê°ë³ìë¡ List<String> ííì ê°ì²Žê° ë€ìŽìšë€.
- 첫ë²ì§ž 맀ê°ë³ìì íì ì§ì ì ìíŽ sort ë©ìëì ì ë€ëŠ íì 맀ê°ë³ìë 몚ë StringìŒë¡ ì§ì ëê² ëë€.
- ë°ëŒì Comparator ìží°íìŽì€ ì ë€ëŠ íì ë StringìŒë¡ ì§ì ëë©°, ì¶ì ë©ìëì 맀ê°ë³ì íì ë StringìŒë¡ ì§ì ëë€.
- ìµì¢ ì ìŒë¡ ëë€ íšìì íì 구ì±ì intí ë©ìë ë°í íì 곌 String í 맀ê°ë³ì íì ëê°ë¡ ì¶ë¡ ëê² ëë€.
ëš, ê°ë°ì ì ì¥ìì ìœë륌 복Ʞí ë ëë€ìì íì ì ìì ê°ìŽ ì ì¶íêž°ìë ìê°ìŽ 걞늬Ʞì, ìí©ì ë°ëŒ ëª ìì ìŒë¡ ëë€ì íëŒë¯ží°ì íì ì êž°ì¬íêž°ë íë€. 묎ììŽ ì¢ìì§ ì ëµì ìê³ ìí©ì ë°ëŒ ê°ë°ìê° ê²°ì íŽìŒ íë€.
Collections.sort(words, (String s1, String s2) -> Integer.compare(s1.length(), s2.length()));
ëë€ ííì íì©íêž°
ë€ìí ëë€ìì í ë¹
ëë€ìì ê°ì¥ í° í¹ì§ì ë°ë¡ ë³ìì ì ì륌 í ë¹íë¯ìŽ íšì륌 í ë¹í ì ìë€ë ê²ìŽë€.
ì¬ì€ íšìë ìŒë° ë°ìŽí° ì²ëŒ ë©ëªšëŠ¬ 죌ìê° í ë¹ ëìŽ ìë€. ì§êžê¹ì§ íŽëì€ë¡ ë©ìë륌 ì¬ì©íŽìêž°ì ë©ìëì ë©ëªšëŠ¬ 죌ì륌 ë³ìì í ë¹íë ìŒì ììì§ë§, ëë€ìì ìŽì©íë©Ž íšì(ì€íìœë)ì 죌ì륌 ì¬ì©íì¬ CìžìŽ, íìŽì¬ ê°ì íšì ì€íìŒì íë¡ê·žëë°ì ìì±í ì ìê² ë ê²ìŽë€.
ëë€ì ë³ì í ë¹
interface IAdd {
int add(int x, int y);
}
public class Main {
public static void main(String[] args) {
IAdd lambda = (x, y) -> x + y; // íšì륌 ë³ìì í ë¹
lambda.add(1, 2); // íšì ì¬ì©
}
}
ëë€ì 맀ê°ë³ì í ë¹
í¹í ëë€ìì ë©ìëì 맀ê°ë³ìì ë°ë¡ ì ë ¥ê°ìŒë¡ ë£ë ë°©ììŒë¡ ì ë§ ì죌 ì ì©ëë€. ìŽê²ì íšì륌 ë©ìëì 맀ê°ë³ìë¡ ë겚ì€ë€ê³ íííë€.
interface IAdd {
int add(int x, int y);
}
public class Main {
public static void main(String[] args) {
int n = result( (x, y) -> x + y ); // ë©ìëì 맀ê°ë³ìì ëë€ìì ì ë¬
System.out.println(n); // 3
}
public static int result(IAdd lambda) {
return lambda.add(1,2);
}
}
êž°ì¡Žì ìë°ì ë©ìë ê°ì ê²œì° ë³ìì í ë¹íê±°ë 맀ê°ë³ìë¡ ë£ê±°ë 늬íŽê°ìŒë¡ ì¬ì©íë íìë ê¿ë 못 êŸžìŽ ìì ê²ìŽë€. íì§ë§ ëë€ììŽ ìŽë°ììŒë¡ ìì©ìŽ ê°ë¥í ìŽì ë ëë€ë ìµëª íšì(Anonymous Function)ìŽë©°, ìµëª íšìë 몚ë ìŒêž ê°ì²Žë¡ ì·šêž ëêž° ë묞ìŽë€.
íšì륌 맀ê°ë³ìë¡ ì ë¬íŽì ì¬ì©íë ê²ì ë¬Žìš ì ë°í êž°ë¥ì²ëŒ ìê°íì§ë§, ì¬ì€ íŽëì€ ì°žì¡° ê°ì²Žë¥Œ ë겚 ì€ ê²ê³Œ ë€ëŠìŽ ìë€. ìëíë©Ž ëë€ìì ìµëª 구í ê°ì²Ž(ìµëª íŽëì€)륌 ì¬íí íê²ìŽê³ , ìµëª íŽëì€ë ê²°êµ íŽëì€ ì°žì¡° ê°ì²ŽìŽë, ì°ëŠ¬ê° ë©ìëì ì°žì¡° ê°ì²Žë¥Œ ë겚 ë©ìë ëŽìì ê°ì²Žì ë©ìë륌 ì¬ì©í ê²ì²ëŒ ë³ë° ë€ë¥Žì§ ìë€.
ëë€ì ë°íê° í ë¹
ìŒêž ê°ì²Žì ëë€ë¥ž í¹ì§ìŽëŒê³ ë§í ì ìë ë©ìëì ë°íê°ì ëë€íšì ì첎륌 늬íŽíëë¡ ì§ì íŽì€ ì ìë€. ìŠ, ë©ìëì 늬íŽê°ìŽ ë©ìë(íšì)ìž ê²ìŽë€.
interface IAdd {
int add(int x, int y);
}
public class Main {
public static void main(String[] args) {
IAdd func = makeFunction(); // ë©ìëì ë°íê°ìŽ ëë€ íšì
int result = func.add(1, 2);
System.out.println(result); // 3
}
public static IAdd makeFunction() {
return (x, y) -> x + y;
}
}
ëë€ì ì€ì ìì
Thread ížì¶
ìë°ì ì°ë ë륌 뚌ì ë°°ì°ì ë ì ë¶ë€ìŽëŒë©Ž, ë€ì곌 ê°ì ìœë ë¬žë² êµ¬ì±ì ëíŽ ìµìí ê²ìŽë€.
ìŽë ì ë°í 묞ë²ìŽ ìëê³ ê²°êµì ììží 볎멎 new Thread() ìì±ì ìì 맀ê°ë³ìë¡ì ëë€ìì ë£ì ê² ë¿ìŽë€.
Thread thread = new Thread( () -> {
for (int i = 0; i < 10; i++) {
System.out.println(i);
}
});
enumì ê¹ëíê²
enum ê°ì²Žì íì¥ì ì¡°êž ë ê°ê²°íê³ ê¹ëíê² ë§ë€ ìë ìë€.
enum Operation {
PLUS("+") {
public double apply(double x, double y) { return x + y; }
},
MINUS("-") {
public double apply(double x, double y) { return x - y; }
},
TIMES("*") {
public double apply(double x, double y) { return x * y; }
},
DIVIDE("/") {
public double apply(double x, double y) { return x * y; }
};
private final String symbol;
Operation(String symbol) { this.symbol = symbol; }
@Override public String toString() { return symbol; }
public abstract double apply(double x, double y);
}
import java.util.function.DoubleBinaryOperator;
enum Operation {
PLUS("+", (x, y) -> x + y),
MINUS("-", (x, y) -> x - y),
TIMES("*", (x, y) -> x * y),
DIVIDE("/", (x, y) -> x / y);
private final String symbol;
private final DoubleBinaryOperator op;
Operation(String symbol, DoubleBinaryOperator op) {
this.symbol = symbol;
this.op = op;
}
@Override
public String toString() { return symbol; }
public double apply(double x, double y) {
return op.applyAsDouble(x, y);
}
}
public class Main {
public static void main(String[] args) {
// ì¬ì©ì ìëì ê°ìŽ
Operation.PLUS.apply(2, 3);
}
}
ëë€ìì íë³í
ì¬ì€ ëë€ìì ìµëª ê°ì²ŽìŽê³ íì ìŽ ìë€. ì íí ë§íë©Ž íšìí ìží°íìŽì€ë¡ ëë€ìì ì°žì¡°í ì ìì ë¿ìŽë€. ê·žëì ì¬ì€ ìží°íìŽì€ íì ì ë³ìì ëë€ìì í ë¹íë íìë ìºì€í ì°ì°ìê° ìëµ ëìŽ ìë€.
IAdd func = () -> {});
IAdd func = (IAdd) (() -> {}); // ìëë ìë³ì íì
ìŽ ë€ë¥Žë¯ë¡ íë³íìŽ íì
ìŽë¬í í¹ì§ì ìŽì©íŽ ëë€ìì 몚ë íŽëì€ì ìµìì íŽëì€ìž Object íŽëì€ë¡ íë³íìŽ ê°ë¥íë€. ìŽë¬í í¹ì§ìŽ ìë€ë ì ëë§ ìê³ ëìŽê°ì.
interface IAdd {
int add(int x, int y);
}
public class Main {
public static void main(String[] args) {
IAdd lambda = (x, y) -> x + y;
System.out.println(lambda);
// Object íì
ìŒë¡ ì
ìºì€í
íêž° ìíŽì ëë² ìºì€í
íŽì£ŒìŽìŒ íë€
Object lambda_obj = (Object) (IAdd) ((x, y) -> x + y);
System.out.println(lambda_obj);
}
}
ëë€ ííìì íê³
ìŽì²ëŒ ëë€ííìì ìê·žëë êžžë€ë ìë° ìœë륌 ë§ëí ì€ìŽëë° ìë¹í ìŒì¡°ë¥Œ íì§ë§, ëšì ìŽë ì¬ì©íêž°ì ì ì ì¹ ëª»í 겜ì°ê° ì¡Žì¬íë€.
1. ëë€ë 묞ìí륌 í ì ìë€
ëë€ ì첎ë ìŽëŠìŽ ìë íšììŽêž° ë묞ì ë©ìëë íŽëì€ì ë€ë¥Žê² 묞ìí륌 í ì ìë€. ê·žëì ìœë ìì²Žë¡ ëììŽ ëª ííê² ì€ëª ëì§ ìê±°ë ëë€ê° êžžê±°ë ìœêž° ìŽë µë€ë©Ž, ì°ì§ ìë ë°©í¥ìŒë¡ 늬í©í ë§íë ê²ì ê³ ë €íŽìŒ íë€.
2. ëë€ë ëë²ê¹ ìŽ ë€ì ê¹ë€ë¡ë€
ëë€ìì Ʞ볞ì ìŒë¡ ìµëª 구í ê°ì²Ž êž°ë°ìŽêž° ë묞ì, ìµëª ê°ì²Ž í¹ì±ì ëë²ê¹ í ë ìœ ì€í(call stack) ì¶ì ìŽ ë§€ì° ìŽë €ìŽ ëšì ì ê°ì§ê³ ìë€.
ì륌ë€ìŽ 0ì ëëë ê°ì ì€ë¥ê° ëíëë ìœë륌 ìŒë° for묞곌 ëë€ìì ìŽì©í ííì ìœë륌 ì€ííë©Ž ë€ì 곌 ê°ìŽ ìë¬ ì€ ìë¶í° íì°í ë€ë¥žê±ž 볌 ì ìë€.
public static void main(String[] args) {
List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);
for (Integer i : list) {
for (int j = 0; j < i; j++) {
System.out.println(i / j);
}
}
}
public static void main(String[] args) {
List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);
list.forEach(i -> {
IntStream.range(0, i).forEach(j -> {
System.out.println(i/j);
});
});
}
ìŽë ëë€ê° ëŽë¶ì ìŒë¡ ìííë ìì ìŽ ë ë§êž° ë묞ì ë°ìíë íììŽêž° ë묞ì, ìœëê° ë³µì¡íŽ ì§ìë¡ ìŽëìì 묞ì ê° ë°ìíëì§ íìžíêž°ê° ìŽë €ìì§ê² ëë€. ê·žëŠ¬ê³ ìŽë 곧 ì±ë¥ê³Œ ì°ê²° ëêž° ë íë€.
3. streamìì ëë€ë¥Œ ì¬ì©í ì for묞 ë³Žë€ ì±ë¥ìŽ ëšìŽì§ë€
ìŽí늬ìŒìŽì ì±ë¥ì ë§€ì° ë¯Œê°í ì¬ëìŽëŒë©Ž ì¹ëª ì ìž ëšì ìŽ ë ì ë ìë€.
ìë ìì ë 0 ë¶í° 10000 ê¹ì§ ëšì ìííë ë¡ì§ì streamì ëë€ì ëšì for묞ìŒë¡ 구ì±íê³ ê°ê° ì€íìê°ì ëë žìŽë¡ 구íë ìœëìŽë€. 결곌륌 볎ë¯ìŽ ë ì€íìê° ì°šìŽë ê²°ìœ ì ì§ ìë€.
public static void main(String[] args) {
// ëë€ì stream ìí ââââââââââââââââââââââââââââââ
long startTime = System.nanoTime(); // ìœë ìì ìê°
IntStream.range(0,10000).forEach((value) -> {});
long endTime = System.nanoTime(); // ìœë ëë ìê°
long durationTimeSec = endTime - startTime;
System.out.println("ëë€ì stream ìí : " + durationTimeSec + "n/s");
// ìŒë° for묞 ìí ââââââââââââââââââââââââââââââ
startTime = System.nanoTime(); // ìœë ìì ìê°
for(int i=0; i<10000; i++){
}
endTime = System.nanoTime(); // ìœë ëë ìê°
durationTimeSec = endTime - startTime;
System.out.println("ìŒë° for묞 ìí : " + durationTimeSec + "n/s");
}
4. ëë€ë¥Œ ëšë°íë©Ž ìœëê° ì§ì ë¶íŽì§ ì ìë€
êž°ì¡Žìë ëì íì륌 믞늬 íŽëì€ì ë©ìëë¡ ì ìíŽëê³ ì€íë¶ìì ê°ë€ ì°ë ê²ìŽìì§ë§, ëë€ë ëì íì륌 ì€íë¶ìì ì§ì íë ììŽë€. ê·žëììžì§ ëë€ìì ëšë°íë€ë³Žë©Ž ë¹ì·íê² ìꞎ íšì륌 ê³ì ì€ë³µ ìì±íê³ ìë ìì ì ë°ê²¬ í ì ìë€.
interface OperationStrategy {
// (int x, int y) -> int
int calculate(int x, int y);
}
// Template
class OperationTemplate {
int calculate(int x, int y, OperationStrategy cal) {
int result = cal.calculate(x, y);
return result;
}
}
public static void main(String[] args) {
int x = 100;
int y = 30;
OperationContext cxt = new OperationContext();
int result = cxt.calculate(x, y, (x1, y1) -> x1 + y1);
System.out.println(result); // 130
result = cxt.calculate(x, y, (x1, y1) -> x1 - y1);
System.out.println(result); // 70
result = cxt.calculate(x, y, (x1, y1) -> x1 * y1);
System.out.println(result); // 3000
result = cxt.calculate(x, y, (x1, y1) -> x1 / y1);
System.out.println(result); // 3
}
ë¹ì€ë¬ŽëŠ¬í ëë€ íšì륌 ë©ìë ìê·ëšŒížë¡ ì§ì íê³ ìë€. ìì ìì ë ì죌 ê°ëší ììëŒ ìë¿ì§ ìì ì ìì§ë§ ëë€ì ë¡ì§ìŽ ëì€ ìžì€ìŽ ëìŽê°ë€ë©Ž ì€íë¶ì ìœëê° ì§ì ë¶íŽ ì§ ìë ìë€.
5. ì¬ê·ë¡ ë§ë€ê²œì°ìë ë€ì ë¶ì í©íë€
ëë€ìì íµíŽ ì¬ê· íšì륌 구ì¶íë©Ž ì€í ì¡°ì°š ìëë 컎íìŒ ìë¬ê° ëíëë€.
public static void main(String[] args) {
UnaryOperator<Long> factorial = (x) -> {
x == 0 ? 1 : x * factorial.apply(x - 1); // compile error
};
factorial(1);
}
# ì°žê³ ìë£
https://github.com/yeGenieee/java-live-study/blob/main/%5B15%5DJava%20Live%20Study.md