μΌ | μ | ν | μ | λͺ© | κΈ | ν |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- java
- GitHub
- μ€λΈμ
- κ°μ¬μ€
- ν΄λ¦°μ½λ
- springboot
- Spring
- Postman
- ν°μ€ν 리μ±λ¦°μ§
- μ½λμ
- μ€νλ§
- mariadb
- ν΄λ¦° μ½λ
- 둬볡
- Codeup
- go
- H2 μ€μΉ
- Vue.js
- Spring Boot
- Python
- Gradle
- κΈ°μ΄100μ
- golang
- MySQL
- μκ³ λ¦¬μ¦
- Git
- spring security
- JPA
- νμ΄μ¬
- thymeleaf
- Today
- Total
nyximos.log
[Java] λλ€μ λ³Έλ¬Έ
π©π λͺ©ν
μλ°μ λλ€μμ λν΄ νμ΅νμΈμ.
π©π» νμ΅ν κ²
- λλ€μ μ¬μ©λ²
- ν¨μν μΈν°νμ΄μ€
- Variable Capture
- λ©μλ, μμ±μ λ νΌλ°μ€
λλ€μ μ¬μ©λ²
λλ€μ Lambda expression
λ©μλλ₯Ό νλμ μexpressionμΌλ‘ ννν κ²
- ν¨μλ₯Ό κ°λ΅νκ³ λͺ ννκ² νν
- νμ΄ν μ΄μ©
- μ΅λͺ ν΄λμ€μ κ°μ²΄μ λμΌνλ€.
νΉμ§
- 0κ° μ΄μμ 맀κ°λ³μλ₯Ό κ°μ§ μ μλ€. λ§€κ° λ³μμ νμμ λͺ
μμ μΌλ‘ μ μΈν μ μλ€.
(int a)μ (a)λ λμΌνλ€. : λ¬Έλ§₯μμ μΆμ - λ§€κ° λ³μλ κ΄νΈλ‘ λ¬Άμ΄κ³ μΌνλ‘ κ΅¬λΆλλ€.
(a, b) λλ (int a, int b) λλ (String a int b, float c) - λΉ κ΄νΈ = λ§€κ° λ³μκ° μμ
- λ¨μΌ λ§€κ° λ³μμ΄κ³ νμ
μ μΆκ° κ°λ₯ν κ²½μ° κ΄νΈλ₯Ό μ¬μ©ν νμκ° μλ€.
a -> return a*a - λλ€μμ λ³Έλ¬Έμλ 0κ° μ΄μμ λ¬Έμ₯μ΄ ν¬ν¨λ μ μλ€.
- λλ€μμ λ³Έλ¬Έμ λ¨μΌ λ¬Έμ₯μΌ κ²½μ° μ€κ΄νΈλ μμ΄λ λλ©°, μΈλ―Έμ½λ‘ μ μλ΅νλ€.
λ°ν νμμ μΌλ°μ μΈ ν¨μμ λμΌνλ€. - λ³Έλ¬Έμ νλ μ΄μμ λ¬Έμ₯μ΄ μμΌλ©΄ μ€κ΄νΈ { } λ‘ λ¬Άμ΄μΌνλ€.
- λ³Έλ¬Έμ νλλΏμΈ λ¬Έμ₯μ΄ return λ¬ΈμΌ κ²½μ° κ΄νΈ{ }λ₯Ό μλ΅ν μ μλ€.
μμ±λ²
1. λ©μλμμ μ΄λ¦κ³Ό λ°ννμ μ μ κ±°νκ³ λ§€κ°λ³μ μ μΈλΆμ λͺΈν΅{ } μ¬μ΄μ -> λ₯Ό μΆκ°νκΈ°λ§ νλ©΄ λλ€.
int max(int a, int b) {
return a > b ? a : b;
}
(int a, int b) -> {
return a > b ? a : b;
}
2. λ°νκ°μ΄ μλ λ©μλμ κ²½μ° returnλ¬Έ λμ μ expression μΌλ‘ λμ ν μ μλ€.
μμ μ°μ° κ²°κ³Όκ° μλμ μΌλ‘ λ°νκ°μ΄ λλ€.
μ΄λ λ¬Έμ₯ statementμ΄ μλ μ expression μ΄λ―λ‘ λμ μΈλ―Έμ½λ‘ μ λΆμ΄μ§ μλλ€.
(int a, int b) -> { return a > b ? a : b; }
(int a, int b) -> a > b ? a : b
3. λλ€μμ μ μΈλ 맀κ°λ³μμ νμ μ μΆλ‘ μ΄ κ°λ₯ν κ²½μ°λ μλ΅ν μ μλλ°, λλΆλΆμ κ²½μ°μ μλ΅κ°λ₯νλ€.
λλ€μμ λ°ννμ μ΄ μλ μ΄μ λ νμ μΆλ‘ μ΄ κ°λ₯νκΈ° λλ¬Έμ΄λ€.
(int a, int b) -> a > b ? a : b
(a, b) -> a > b ? a : b
4. μ μΈλ 맀κ°λ³μκ° νλλΏμΈ κ²½μ°μλ κ΄νΈ( )λ₯Ό μλ΅ν μ μλ€.
맀κ°λ³μμ νμ μ΄ μμΌλ©΄ κ΄νΈ ( )λ₯Ό μλ΅ν μ μλ€.
(a) -> a * a
a -> a * a
(int a) -> a * a
int a -> a * a // error
5. κ΄νΈ { } μμ λ¬Έμ₯μ΄ νλμΌ λλ κ΄νΈ { }λ₯Ό μλ΅ν μ μλ€. λ¬Έμ₯μ λμ μΈλ―Έμ½λ‘ μ λΆμ΄μ§ μμμΌ νλ€.
(String name, int i) -> {
System.out.println(name+"="+i);
}
(String name, int i) ->
System.out.println(name="="+i)
6. κ΄νΈ { } μμ νλλΏμΈ λ¬Έμ₯μ΄ return μΌ κ²½μ°μλ κ΄νΈ { }λ₯Ό μλ΅ν μ μλ€.
(int a, int b) -> { return a > b ? a : b; } // OK
(int a, int b) -> return a > b ? a : b // error
ν¨μν μΈν°νμ΄μ€ Functional Interface
μλ°8μμ λμ λ ν¨μν νλ‘κ·Έλλ°μ ꡬννκΈ° μν΄ Java8λΆν° λμ λ java.util.function ν¨ν€μ§μ μΌλΆ
- μΆμ λ©μλλ₯Ό 1κ°λ§ κ°μ§κ³ μλ μΈν°νμ΄μ€
- SAM Single Abstract Method μΈν°νμ΄μ€
- @FunctionalInterface μ΄λ
Έν
μ΄μ
μ κ°μ§ μΈν°νμ΄μ€
μΈν°νμ΄μ€μ λͺ©μ μ λͺ ννκ² μ λ¬νκ³ μ‘°κ±΄μ μΆ©μ‘±νμ§ μμ κ²½μ° μ»΄νμΌλ¬κ° μ€λ₯λ₯Ό μμ±ν μ μκ² νλ€. - default methodμ static mehtodλ μ¬λ¬κ° μ‘΄μ¬ν΄λ μκ΄ μλ€.
λ©μλ maxκ° μ μΈλ MyFunction μΈν°νμ΄μ€ μ μ
interface MyFunction {
public abstract int max(int a, int b);
}
μΈν°νμ΄μ€λ₯Ό ꡬνν μ΅λͺ ν΄λμ€ κ°μ²΄
MyFunction f = MyFunction() {
public int max(int a, int b) {
return a > b ? a : b;
}
};
int big = f.max(5,3); // μ΅λͺ
κ°μ²΄μ λ©μλλ₯Ό νΈμΆ
MyFunction μΈν°νμ΄μ€μ μ μλ λ©μλ max()λ λλ€μ '(int a, int b) -> a > b ? a : b' κ³Ό λ©μλμ μ μΈλΆκ° μΌμΉνλ€.
μ μ½λμ μ΅λͺ κ°μ²΄λ₯Ό λλ€μμΌλ‘ μλμ κ°μ΄ λ체ν μ μλ€.
MyFunction f = (int a, int b) -> a > b ? a : b; // μ΅λͺ
κ°μ²΄λ₯Ό λλ€μμΌλ‘ λ체
int big = f.max(5,3); // μ΅λͺ
κ°μ²΄μ λ©μλλ₯Ό νΈμΆ
λλ€μλ μ€μ λ‘λ μ΅λͺ κ°μ²΄μ΄κ³ , MyFunction μΈν°νμ΄μ€λ₯Ό ꡬνν μ΅λͺ κ°μ²΄μ λ©μλ max()μ λλ€μμ 맀κ°λ³μ νμ κ³Ό κ°μ κ·Έλ¦¬κ³ λ°νκ°μ΄ μΌμΉνκΈ° λλ¬Έμ λλ€μμΌλ‘ λ체ν μ μλ€.
νλμ λ©μλκ° μ μΈλ μΈν°νμ΄μ€λ₯Ό μ μν΄μ λλ€μμ λ€λ£¨λ κ²μ κΈ°μ‘΄μ μλ°μ κ·μΉμ μ΄κΈ°μ§ μμΌλ©΄μλ μμ°μ€λ½λ€.
κ·Έλμ μΈν°νμ΄μ€λ₯Ό ν΅ν΄ λλ€μμ λ€λ£¨κΈ°λ‘ κ²°μ νλ€.
ν¨μν μΈν°νμ΄μ€ MyFunction μ μ
@FunctionalInterface
interface MyFunction {
public abstract int max(int a, int b);
}
ν¨μν μΈν°νμ΄μ€μλ μ€μ§ νλμ μΆμ λ©μλλ§ μ μλμ΄ μμ΄μΌ νλ€λ μ μ½μ΄ μλ€.
λλ€μκ³Ό μΈν°νμ΄μ€μ λ©μλκ° 1:1λ‘ μ°κ²°λ μ μκΈ° λλ¬Έμ΄λ€.
ν¨μν μΈν°νμ΄μ€λ§λ€ μ€ν λ©μλ μ΄λ¦μ΄ λ€λ₯΄λ€.
Package java.util.function
1) Runnable
μΈμ π βοΈ
λ°νκ° π βοΈ
public interface Runnable {
public abstract void run();
}
Runnable runnable = () -> System.out.println("run");
runnable.run();
run
2) Supplier
μΈμ π βοΈ
λ°νκ° T νμ πβοΈ
public interface Supplier<T> {
T get();
}
Supplier<String> sayHi = () -> "Hello World!";
String str = sayHi.get();
System.out.println(str);
Hello World!
3) Consumer
μΈμ T νμ πβοΈ
λ°νκ° π βοΈ
public interface Consumer<T> {
void accept(T t);
default Consumer<T> andThen(Consumer<? super T> after) {
Object.requireNonNull(after);
return (T t) -> { accept(t); after.accept(t); };
}
}
Consumer<String> makeJuice = fruit -> System.out.println(fruit + " Juice");
makeJuice.accept("Apple");
Apple Juice
Consumer<String> makeJuice = fruit -> System.out.println(fruit + " Juice");
Consumer<String> answer = fruit -> System.out.println("--> Love");
makeJuice.andThen(answer).accept("Apple");
Apple Juice
--> Love
4) Function
μΈμ T νμ πβοΈ
λ°νκ° R νμ πβοΈ
public interface Function<T, R> {
R apply(T t);
default <V> Function<V, R> compose(Function<? super V, ? extends T> before) {
Objects.requireNonNull(before);
return (V v) -> apply(before.apply(v));
}
default <V> Function<T, V> andThen(Function<? super R, ? extends V> after) {
Objects.requireNonNull(after);
return (T t) -> after.apply(apply(t));
}
static <T> Function<T, T> identity() {
return t -> t;
}
}
Function<Integer, Integer> multiply = (value) -> value * 2;
Integer result = multiply.apply(3);
System.out.println(result);
6
Function<Integer, Integer> multiply = (value) -> value * 2;
Function<Integer, Integer> add = (value) -> value + 3;
Function<Integer, Integer> addThenMultiply = multiply.compose(add);
Integer result1 = addThenMultiply.apply(3);
System.out.println(result1);
12
5) Predicate
μΈμ Tνμ πβοΈ
λ°νκ° boolean πβοΈ
public interface Predicate<T> {
boolean test(T t);
default Predicate<T> and(Predicate<? super T> other) {
Objects.requireNonNull(other);
return (t) -> test(t) && other.test(t);
}
default Predicate<T> negate() {
return (t) -> !test(t);
}
default Predicate<T> or(Predicate<? super T> other) {
Objects.requireNonNull(other);
return (t) -> test(t) || other.test(t);
}
static <T> Predicate<T> isEqual(Object targetRef) {
return (null == targetRef)
? Objects::isNull
: object -> targetRef.equals(object);
}
}
test()
Predicate<Integer> isBiggerThanFive = num -> num > 5;
System.out.println("10 is bigger than 5? -> " + isBiggerThanFive.test(10));
10 is bigger than 5? -> true
and() / or()
Predicate<Integer> isBiggerThanFive = num -> num > 5;
Predicate<Integer> isLowerThanSix = num -> num < 6;
System.out.println(isBiggerThanFive.and(isLowerThanSix).test(10));
System.out.println(isBiggerThanFive.or(isLowerThanSix).test(10));
false
true
Predicate<String> isEquals = Predicate.isEqual("Google");
isEquals.test("Google");
true
Variable Capture
λλ€λ μΈμ€ν΄μ€ λ³μμ static λ³μ, μ§μλ³μλ₯Ό μμ λ‘κ² μΊ‘μ²ν΄μ μ¬μ©ν μ μλ€.
μΈμ€ν΄μ€ λ³μ : heapμ μ μ₯, μ°λ λλΌλ¦¬ 곡μ κ°λ₯
static λ³μ : λͺ¨λ μΈμ€ν΄μ€μμ 곡μ
μ§μ λ³μ : stackμ μ μ₯, μ°λ λλΌλ¦¬ 곡μ λΆκ°λ₯
λλ€
μΈμ€ν΄μ€ λ³μλ heapμ μ§μ μ κ·Όν΄μ μ¬μ©
μ§μ λ³μμ μ§μ μ κ·Όνμ§ μκ³ , λ³μλ₯Ό stackμ 볡μ¬ν΄μ μ¬μ©νλ€.
variable capture
λλ€μμ νλΌλ―Έν°λ‘ λκ²¨μ§ λ³μλ₯Ό μ¬μ©νλ κ²μ΄ μλλΌ μΈλΆμμ μ μΈν λ³μλ₯Ό μ°Έμ‘°νμ¬ μ¬μ©νλ κ²
final ν€μλλ‘ μμ±νκ±°λ effectively final λ³μμ¬μΌ νλ€.
μΊ‘μ²ν λ³μλ₯Ό λ³κ²½νλ €κ³ νλ©΄ μ»΄νμΌ μ€λ₯κ° λ°μνλ€.
final λ³μ
λλ€ ννμ λ΄λΆμμ ν΄λΉ λ³μλ₯Ό λ³κ²½ν μ μλ€κ³ νλ€.
effectively final λ³μ
λλ€ ννμ λ΄λΆμμλ§ μ¬μ©λκ³ , ν λ² ν λΉν νμλ λ³κ²½λμ§ μλ λ³μ
λλ€ ννμμμ ν΄λΉ λ³μλ₯Ό μΊ‘μ²ν λ finalμ μ¬μ©νμ§ μλλΌλ finalκ³Ό λμΌν ν¨κ³Όλ₯Ό κ°λλ€. (μλ°8λΆν° κ°λ₯)
public void printNumber(int number) {
int x = 1; // μΌλ° μ§μ λ³μ
int y = 2; // μΌλ° μ§μ λ³μ
int z = 3; // μΌλ° μ§μ λ³μ
int sum = x + y + z + number; // μΊ‘μ²ν λ³μ μ¬μ©
Consumer<Integer> printer = n -> {
// x = 100; // μ»΄νμΌ μ€λ₯
// y++; // μ»΄νμΌ μ€λ₯
// z = z * 2; // μ»΄νμΌ μ€λ₯
System.out.println(sum); // μΊ‘μ²ν λ³μ μ¬μ©
};
printer.accept(number);
}
컬λ μ μ΄λ λ°°μ΄ λ³μλ₯Ό λλ€ λ΄λΆμμ λ³κ²½νλ κ²μ κ°λ₯νμ§λ§ νμ μμ νμ§λ μλ€.
λ€λ₯Έ μ°λ λλ μ½λμμ λμμ μ κ·Ό λλ κ²½μ° λ¬Έμ κ° λ°μν μ μλ€.
λ©μλ λ νΌλ°μ€
- λλ€μμ΄ νλμ λ©μλλ§ νΈμΆνλ κ²½μ°μ λλ€μμ κ°λ΅ν ν μ μλ€.
- ν΄λμ€λͺ ::λ©μλλͺ or μ°Έμ‘°λ³μ::λ©μλλͺ
- λλ€μμ μΌλΆκ° μλ΅λμμ§λ§,
- μ»΄νμΌλ¬κ° μλ΅λ λΆλΆμ μ°λ³μ parseInt λ©μλ μ μΈλΆλ‘λΆν°, μ’λ³μ Function μΈν°νμ΄μ€μ μ§μ λ μ§λ€λ¦ νμ μΌλ‘λΆν° μ½κ² μμλΌ μ μλ€.
Function<String, Integer> f = (String s) -> Integer.parseInt(s);
// λ©μλ μ°Έμ‘°
Function<String, Integer> f = Integer::parseInt;
static λ©μλ μ°Έμ‘°
(x) -> ClassName.method(x) // λλ€
ClassName::method // λ©μλ μ°Έμ‘°
μΈμ€ν΄μ€ λ©μλ μ°Έμ‘°
(obj, x) -> obj.method(x) // λλ€
ClassName::method // λ©μλ μ°Έμ‘°
νΉμ κ°μ²΄ μΈμ€ν΄μ€ λ©μλ μ°Έμ‘°
(x) -> obj.method(x) // λλ€
obj::method // λ©μλ μ°Έμ‘°
μμ±μ λ νΌλ°μ€
μμ±μλ₯Ό νΈμΆνλ λλ€μλ λ©μλ μ°Έμ‘°λ‘ λ³νν μ μλ€.
Supplier<MyClass> s = () -> new MyClass(); // λλ€μ
Supplier<MyClass> s = MyClass::new(); // λ©μλ μ°Έμ‘°
맀κ°λ³μκ° μλ μμ±μλ 맀κ°λ³μ κ°―μμ λ°λΌ μλ§μ ν¨μν μΈν°νμ΄μ€λ₯Ό μ¬μ©νλ€.
νμνλ€λ©΄ ν¨μν μΈν°νμ΄μ€λ₯Ό μλ‘ μ μνλ€.
Function<Integer, MyClass> f = (i) -> new MyClass(i); // λλ€μ
Function<Integer, MyClass> f2 = myClass::new; // λ©μλ μ°Έμ‘°
Function<Integer, String, MyClass> bf = (i,s) -> new MyClass(i,s); // λλ€μ
Function<Integer, String, MyClass> bf2 = myClass::new; // λ©μλ μ°Έμ‘°
λ°°μ΄ μμ±
Function<Integer, int[]> f = x -> new int[x]; // λλ€μ
Function<Integer, int[]> f2 = int[]::new; // λ©μλ μ°Έμ‘°
μ°Έμ‘°
λ¨κΆμ±, μλ°μ μ μ κΈ°μ΄νΈ, λμ°μΆν, 2019
'Programming > JAVA' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
[Java] μ λ€λ¦ (1) | 2022.09.26 |
---|---|
[Java] I/O (1) | 2022.09.21 |
[Java] μ λ Έν μ΄μ (1) | 2022.09.11 |
[Java] Enum (1) | 2022.09.08 |
[Java] λ©ν°μ°λ λ νλ‘κ·Έλλ° (0) | 2022.09.06 |