• μλ νμΈμ~ μ΄μ μ μ΄μνλ λΈλ‘κ·Έ λ° GitHub, κ³΅λΆ λ΄μ©μ μ 리νλ Study-GitHub κ° μμ΅λλ€!
• π
β ν¨μν μΈν°νμ΄μ€ - @FunctionalInterface
μλ νμΈμ~ μ΄λ²μ μ 리ν λ΄μ©μ ν¨μν μΈν°νμ΄μ€ μ λλ€.
ν¨μν μΈν°νμ΄μ€λ₯Ό μκΈ°νκΈ° μ μ μΌκΈ κ°μ²΄(First Class Citizon)μ λν΄ κ°λ¨ν μμλ³΄κ² μ΅λλ€.
First Class Citizon
• First Class Citizon μ μλμ μμ±λ€μ λͺ¨μ£Ό λ§μ‘±ν΄μΌ ν©λλ€.
• λ³μμ κ°μ ν λΉν μ μμ΄μΌ ν©λλ€.
• ν¨μμ νλΌλ―Έν°λ‘ λκ²¨μ€ μ μμ΄μΌ ν©λλ€.
• ν¨μμ λ°νκ°μ΄ λ μ μμ΄μΌ ν©λλ€.
β
Javaμ λ©μλλ μ 쑰건μ λͺ¨λλ₯Ό λ§μ‘±νμ§ μμΌλ―λ‘ μΌκΈκ°μ²΄κ° μλκ³ ,
λ°λΌμ Javaλ ν¨μν νλ‘κ·Έλλ° μΈμ΄κ° μλλλ€.
νμ§λ§, Java8μμλ ν¨μλ₯Ό μΌκΈκ°μ²΄μ²λΌ λ€λ£° μ μκ² ν¨μν μΈν°νμ΄μ€λ₯Ό μ 곡ν©λλ€.
@FunctionalInterface μ΄λ Έν μ΄μ μ μλ°8μμ μΆκ°λ μ΄λ Έν μ΄μ μ λλ€.
β
ν¨μν μΈν°νμ΄μ€(Functional Interface)λ μΆμ λ©μλκ° λ± νλλ§ μ‘΄μ¬νλ μΈν°νμ΄μ€λ₯Ό λ§ν©λλ€.
κ·Έλ¦¬κ³ λλ€μμ μ΄λ¬ν ν¨μν μΈν°νμ΄μ€λ₯Ό κΈ°λ°μΌλ‘λ§ μμ±μ΄ λ μ μμ΅λλ€.
β
β μ¦, ν¨μν μΈν°νμ΄μ€λ₯Ό μ¬μ©νλ μ΄μ λ λλ€μμ ν¨μν μΈν°νμ΄μ€λ‘λ§ μ κ·Όμ΄ κ°λ₯νκΈ° λλ¬Έμ μ¬μ©ν©λλ€! β
βκ°λ¨ν μμλ₯Ό ν΅ν΄ μΆμ λ©μλκ° νλλ§ μ‘΄μ¬νλ μΈν°νμ΄μ€λ μ΄λ€κ²μΈμ§ μ΄ν΄λ³΄κ² μ΅λλ€.
β
β
β
• 맀κ°λ³μκ° μκ³ λ°ννμ§ μλ λλ€μ
μ μμ μμ λ³΄λ― μ¬λ¬κ°μ§μ ννμ΄ κ°λ₯ν©λλ€.
β
(String s) -> { System.out.println(s); }
μ€μμ΄ μλ λλ€μμ μμ κ°μ΅λλ€. 맀κ°λ³μ μ 보μ μκ΄νΈλ₯Ό νκ³ λ©μλ λͺΈμ²΄μλ μ€κ΄νΈλ₯Ό ν©λλ€.
β
(String s) -> System.out.println(s);
(s) -> System.out.println(s);
μ€κ΄νΈλ₯Ό μλ΅ν λλ ν΄λΉ λ¬Έμ₯μ λμ μμΉν μΈλ―Έμ½λ‘ λ ν¨κ» μλ΅ν΄μΌ ν©λλ€.
κ·Έλ¦¬κ³ μ μ½λμμ 맀κ°λ³μμ μ 보μ λν΄ sκ° Stringν μμ μ»΄νμΌλ¬μ μ μ₯μμ μ μΆκ° κ°λ₯ν©λλ€.
λ°λΌμ λ λ²μ§Έ λ°©μμ²λΌ, 맀κ°λ³μμ μλ£ν μ 보(String)λ μλ΅μ΄ κ°λ₯ν©λλ€.
β
s -> System.out.println(s)
κ·Έλ¦¬κ³ λ§€κ°λ³μκ° μμ κ°μ΄ νλμΌ κ²½μ°μλ λ€μκ³Ό κ°μ΄ μκ΄νΈλ μλ΅ν μ μμ΅λλ€.
;
β
System.out::println
λ§μ§λ§ ννμμ :: μ λ©μλ μ°Έμ‘°(Method References)λ₯Ό μλ―Έν©λλ€.
β λ©μλ μ°Έμ‘°(Method References)λ?
λλ€μλ κ²°κ΅ λ©μλμ μ μμ΄λ―λ‘ λ€μκ³Ό κ°μ΄ μκ°ν΄ λ³Ό μ μμ΅λλ€. "μ΄λ―Έ μ μλμ΄ μλ λ©μλκ° μλ€λ©΄, μ΄ λ©μλμ μ μκ° λλ€μμ λμ ν μ μμ§ μμκΉ?" μ€μ λ©μλ μ μλ λλ€μμ λμ ν μ μλλ°, μ΄λ₯Ό "λ©μλ μ°Έμ‘°(Method References)"λΌκ³ ν©λλ€. μ½λμ μμ μ€μ΄κ³ , κ°λ μ±λ κ°μ λλ€λ μ μμ 'λ©μλ μ°Έμ‘°'λ λλ€μμΌλ‘ μ€μ΄λ μ½λμ μμ μ‘°κΈ λ μ€μΌ μ μμ΅λλ€. ClassName::MethodName μΆμ²: μ€μ±μ°μ μ΄ν Java νλ‘κ·Έλλ° |
Consumer<List<Integer>> c = l -> Collections.reverse(l); // μ μ₯ μμ λ€μ§κΈ°
Consumer<List<Integer>> c = Collections::reverse(); // μμ λμΌν κ²°κ³Ό
Function<char[], String> f = ar -> { return new String(ar); };
Function<char[], String> f = String::new; // μμ±μ μ°Έμ‘°
• 맀κ°λ³μκ° μκ³ λ°ννλ λλ€μ
μμ μμ μμ λ±μ₯ν λλ€μμ λ€μκ³Ό κ°μ΅λλ€.
β
(a, b) -> { return a+b; };
λ©μλ λͺΈμ²΄μ ν΄λΉνλ λ΄μ©μ΄ return λ¬ΈμΌκ²½μ°, κ·Έ λ¬Έμ₯μ΄ νλμ΄λλΌλ μ€κ΄νΈμ μλ΅μ΄ λΆκ°λ₯ν©λλ€.
νμ§λ§ μμ λλ€μμ λ€μκ³Ό κ°μ ννμ΄ κ°λ₯ν©λλ€.
(a, b) -> a + b;
μμ κ²½μ° λ©μλ λͺΈμ²΄μ μ°μ°μ΄ λ±μ₯νλλ°, μ΄ μ°μ°μ΄ μ§νλλ©΄ κ·Έ κ²°κ³Όλ‘ κ°μ΄ λ¨κ²λ©λλ€.
κ·Έλ¬λ©΄ μ΄ κ°μ λ³λλ‘ λͺ μνμ§ μμλ λ°νμ λμμ΄ λ©λλ€.
λ°λΌμ returnλ¬Έμ΄ λ©μλ λͺΈμ²΄λ₯Ό μ΄λ£¨λ μ μΌν λ¬Έμ₯μ΄λΌλ©΄ μμ κ°μ΄ μλ΅ν΄μ μμ±ν μ μμ΅λλ€.
κ°λ¨νκ² λλ€μμ ν΅ν΄ ν¨μν μΈν°νμ΄μ€μ μμμ λν΄ μμ보μλλ°μ,
ν¨μν μΈν°νμ΄μ€λ₯Ό λ€μ μ μνμλ©΄ λ€μκ³Ό κ°μ΅λλ€.
ν¨μν μΈν°νμ΄μ€(Functional Interface)λ μΆμ λ©μλκ° λ¨ νλλ§ μ‘΄μ¬νλ μΈν°νμ΄μ€λ₯Ό λ§ν©λλ€. κ·Έλ¦¬κ³ λλ€μμ μ΄λ¬ν ν¨μν μΈν°νμ΄μ€λ₯Ό κΈ°λ°μΌλ‘λ§ μμ±μ΄ λ μ μμ΅λλ€. |
β
λ€μμ ν¨μν μΈν°νμ΄μ€μ ν΄λΉ μ΄λ Έν μ΄μ μ΄ λΆμ΄ μλ μΈν°νμ΄μ€μ μμμ λλ€.
@FunctionalInterface
interface Calculate {
int cal(int a, int b);
}
@FunctionalInterface μ΄λ Έν μ΄μ μ ν¨μν μΈν°νμ΄μ€ λΆν©νλμ§λ₯Ό νμΈνκΈ° μν μ΄λ Έν μ΄μ νμ μ λλ€.
β
λ§μ½ μ μΈν°νμ΄μ€μμ λ μ΄μμ μΆμ λ©μλκ° μ‘΄μ¬νλ€λ©΄, μ΄λ ν¨μν μΈν°νμ΄μ€κ° μλκΈ° λλ¬Έμ μ»΄νμΌ μ€λ₯λ₯Ό λ°μν©λλ€.
Invalid '@FunctionalInterface' annotation; Calculate is not a functional interface
@FunctionalInterface μ΄λ Έν μ΄μ μ΄ νλΉνμ§ μκ³ , Calculate λ ν¨μν μΈν°νμ΄μ€κ° μλλΌκ³ λ§ν©λλ€.
β
β
νμ§λ§, staticμ΄λ default μ μΈμ΄ λΆμ λ©μλμ κ²½μ° ν¨μν μΈν°νμ΄μ€μλ μλ¬΄λ° μν₯μ λ―ΈμΉμ§ μμ΅λλ€.
β
λ°λΌμ λ€μ μΈν°νμ΄μ€λ ν¨μν μΈν°νμ΄μ€λΌκ³ ν μ μμ΅λλ€.
μΈν°νμ΄μ€λ μ λ€λ¦μΌλ‘ μ μνλ κ²μ΄ κ°λ₯ν©λλ€. μ΄λ¬ν λ°©μμ μλ° 8 μμλΆν°λ μμ£Ό νν μΌμ΄ λμμ΅λλ€.
β
μ μΈν°νμ΄μ€λ₯Ό μ λ€λ¦μΌλ‘ μ μνλκ²μ λν΄ μ€λͺ μ νλλ?
-> μ΄νμ λμ¬ λ€ μ’ λ₯μ ν¨μν μΈν°νμ΄μ€μμ μ¬μ©λκΈ° λλ¬Έμ λλ€!
μμ μΈ λ¬Έμ₯μ λλ€μμ λμΌνμ§λ§, μ°Έμ‘°λ³μμ μλ£νμ΄ λͺ¨λ λ€λ₯΄λ―λ‘ μ ν λ€λ₯Έ μΈμ€ν΄μ€μ μμ±μΌλ‘ μ΄μ΄μ§λλ€.
μ μν λ§μ μ νλ μΈμ€ν΄μ€, λ¬Έμμ΄, μ€μνμ μ°Έμ‘°νλ κ° μΈμ€ν΄μ€κ° μμ±λ©λλ€.
β μλ°μ μ μλμ΄ μλ ν¨μν μΈν°νμ΄μ€
• Function<T, R>
μ μ¬μ§μ Function<T, R> μ λ΄λΆ μ½λμ€ μΌλΆ μ λλ€.
β
μ μΈν°νμ΄μ€μλ λ€μκ³Ό κ°μ μΆμ λ©μλκ° μ‘΄μ¬ν©λλ€.
R apply(T t); // μ λ¬ μΈμμ λ°ν κ°μ΄ λͺ¨λ μ‘΄μ¬ν λ
apply λΌλ λ©μλκ° μ‘΄μ¬νκ³ , μΈμλ‘λ μ΄λ€ νμ μ T(μ λ€λ¦) μ λ°κ³ R(μ λ€λ¦) μ 리ν΄ν©λλ€.
β Function μμ
package other;
import java.util.function.Function;
public class FunctionalInterfaceExamples {
public static void main(String[] args) {
Function<String, Integer> toInt = new Function<String, Integer>(){
@Override
public Integer apply(String t) {
return Integer.parseInt(t);
}
};
// Function<String, Integer> toInt = Integer::parseInt;
Integer number = toInt.apply("100");
System.out.println("number: " + number);
}
}
ν¨μν μΈν°νμ΄μ€μΈ Function<T, R>μ μ¬μ©ν΄ λ΄λΆμ apply() λ©μλλ₯Ό ꡬνν μ½λμ λλ€.
β
Function<String, Integer> toInt = new Function<String, Integer>() {
@Override
public Integer apply(String t) {
return Integer.parseInt(t);
}
};
μ μμ λ₯Ό 리ν©ν λ§ ν΄μ λλ€ ννμμΌλ‘ λ³κ²½ν΄λ³΄λλ‘ νκ² μ΅λλ€.
β λ¨Όμ new λΆν° λ©μλ μ΄λ¦(apply)κΉμ§ λͺ¨λ μ κ±°νκ³ , λ§μ§λ§ μ€κ΄νΈλ₯Ό μ κ±°ν©λλ€.
Function<String, Integer> toInt = (String t) {
return Integer.parseInt(t);
};
β‘ κ·Έ ν 맀κ°λ³μμ μ€κ΄νΈ μ¬μ΄μ ->(λλ€ννμ) λ₯Ό μΆκ°ν©λλ€.
Function<String, Integer> toInt = (String t) -> {
return Integer.parseInt(t);
}
β’ μ ꡬ쑰λ§μΌλ‘λ λλ€ ννμμ΄μ§λ§, μ’ λ κ°κ²°νκ² λνλ΄ λ³΄κ² μ΅λλ€.
• Type μλ£νμ μ κ±°ν©λλ€.
• return λ¬Έλ μ κ±°ν©λλ€.
• νμμλ μ€κ΄νΈλ₯Ό μ κ±°ν©λλ€.
Function<String, Integer> toInt = t -> Integer.pasreInt(t);
β£ μ λλ€μμ λ©μλ μ°Έμ‘°λ₯Ό μ¬μ©νλ©΄ μ΅μ’ μ μΌλ‘ λ€μκ³Ό κ°μ΅λλ€.
Function<String, Integer> toInt = Integer::parseInt;
• Consumer<T>
μ μ¬μ§μ Consumer<T> μ λ΄λΆ μ½λμ€ μΌλΆ μ λλ€.
β
μ μΈν°νμ΄μ€μλ λ€μκ³Ό κ°μ μΆμ λ©μλκ° μ‘΄μ¬ν©λλ€.
void accept(T t); // μ λ¬λ μΈμ κΈ°λ°μΌλ‘ 'λ°ν' μ΄μΈμ λ€λ₯Έ κ²°κ³Όλ₯Ό λ³΄μΌ λ
Consumer μλΉνλ€ λΌλ λ¨μ΄λ§ λ΄λ μ μΆν μ μλ―μ΄, μΈμλ μ λ¬λ°μ§λ§ λ°νμ νμ§ μμ΅λλ€.
β Consumer μμ
package other;
import java.util.function.Consumer;
public class FunctionalInterfaceExamples {
public static void main(String[] args) {
Consumer<String> print = new Consumer<String>() {
@Override
public void accept(String t) {
System.out.println(t);
}
};
//Consumer<String> print = System.out::println;
print.accept("Hello World");
}
}
ν¨μν μΈν°νμ΄μ€μΈ Consumer<T>μ μ¬μ©ν΄ λ΄λΆμ accept() λ©μλλ₯Ό ꡬνν μ½λμ λλ€.
β(λλ€ ννΈμμ μ£Όμ μ²λ¦¬λ₯Ό ν΄λμ λΆλΆμ΄λ©°, λλ€ λ°©μμΌλ‘μ κ³Όμ μ μλ΅νλλ‘ νκ² μ΅λλ€!)
• Predicate<T>
μ μ¬μ§μ Predicate<T> μ λ΄λΆ μ½λμ€ μΌλΆ μ λλ€.
β
μ μΈν°νμ΄μ€μλ λ€μκ³Ό κ°μ μΆμ λ©μλκ° μ‘΄μ¬ν©λλ€.
boolean test(T t); // μ λ¬λ μΈμλ₯Ό λμμΌλ‘ True, False λ₯Ό νλ¨ν λ
βλ°λΌμ Predicate<T> μΈν°νμ΄μ€λ μ λ¬λ μΈμλ₯Ό νλ¨νμ¬ true λλ falseλ₯Ό λ°νν΄μΌ νλ μν©μμ μ μ©ν©λλ€.
β Predicate μμ
package other;
import java.util.function.Predicate;
public class FunctionalInterfaceExamples {
public static void main(String[] args) {
Predicate<Integer> isPositive = i -> i > 0;
System.out.println(isPositive.test(-1));
System.out.println(isPositive.test(0));
System.out.println(isPositive.test(1));
}
}
package other;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.function.Predicate;
public class FunctionalInterfaceExamples {
public static void main(String[] args) {
List<Integer> numbers = Arrays.asList(-5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5);
List<Integer> positiveNumbers = new ArrayList<>();
/* μμλ§ μ μ₯ */
for (Integer num : numbers) {
if (num > 0) {
positiveNumbers.add(num);
}
}
System.out.println("Positive Integers: " + positiveNumbers);
Predicate<Integer> lessThan3 = i -> i < 3;
List<Integer> numbersLessThan3 = new ArrayList<>();
/* μμλ§ μ μ₯ */
for (Integer num : numbers) {
if (lessThan3.test(num)) {
numbersLessThan3.add(num);
}
}
System.out.println("numbersLessThan3: " + numbersLessThan3);
}
}
μ μ½λλ Listλ₯Ό μμ±νκ³ , forλ¬Έμ μννλ©° 쑰건문μ ν΅ν΄ νν°λ§νλ λμΌν μ½λκ° μ€λ³΅λλ
보μΌλ¬ νλ μ΄νΈ μ½λκ° λ§μ΅λλ€.
ν¨μλ₯Ό λ§λ€μ΄μ λΉΌλΈ λ€ μ€λ³΅ μ½λλ₯Ό μ κ±°ν΄λ³΄λλ‘ νκ² μ΅λλ€.
package other;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.function.Predicate;
public class FunctionalInterfaceExamples {
private static <T> List<T> filter(List<T> list, Predicate<T> filters) {
List<T> result = new ArrayList<>();
for (T input : list) {
if (filters.test(input)) { // Predicateμ 쑰건μ λ°λΌ λΆλ₯
result.add(input);
}
}
return result;
}
public static void main(String[] args) {
List<Integer> numbers = Arrays.asList(-5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5);
Predicate<Integer> isPositive = i -> i > 0;
List<Integer> positiveNumbers = new ArrayList<>();
/* μμλ§ μ μ₯ */
for (Integer num : numbers) {
if (num > 0) {
positiveNumbers.add(num);
}
}
System.out.println("Positive Integers: " + positiveNumbers);
Predicate<Integer> lessThan3 = i -> i < 3;
List<Integer> numbersLessThan3 = new ArrayList<>();
for (Integer num : numbers) {
if (lessThan3.test(num)) {
numbersLessThan3.add(num);
}
}
System.out.println("numbersLessThan3: " + numbersLessThan3);
System.out.println("Positive Integers: " + filter(numbers, isPositive));
//System.out.println("Positive Integers: " + filter(numbers, i -> i > 0));
System.out.println("numbersLessThan3: " + filter(numbers, lessThan3));
}
}
List μ Predicate λ₯Ό 맀κ°λ³μλ‘ λ°λ μ λ€λ¦ λ©μλ filter() λ₯Ό λ§λ€μμ΅λλ€.
β
filter() ν¨μλ 맀κ°λ³μμ List μμλ€μ λν΄ λ°λ³΅λ¬Έμ ν΅ν΄ Predicate<T> μΈν°νμ΄μ€μ test λ©μλλ₯Ό ν΅ν΄ trueμΈ κ²½μ° λ¦¬ν΄ν ListμΈ result μ μ μ₯ν©λλ€. λ§μ΄ κΈΈμ΄μ‘λλ°μ, μμ½νλ©΄ λ€μκ³Ό κ°μ΅λλ€.
β
List , Predicateλ₯Ό μΈμλ‘ λ°κ³ , Listμ μμλ€μ΄ νΉμ 쑰건μ λ§μ‘±ν κ²½μ°(test) λ€λ₯Έ 리μ€νΈ(result)μ μ μ₯ν©λλ€.
λ§μ§λ§μΌλ‘ Predicate<T> μΈν°νμ΄μ€λ₯Ό ν΅ν΄ νμ, μ§μμ ν©μ ꡬνλ μμ λ₯Ό λ³΄κ² μ΅λλ€.
package other;
import java.util.Arrays;
import java.util.List;
import java.util.function.Predicate;
public class PredicateExample {
public static int filterSum(Predicate<Integer> filter, List<Integer> list) {
int sum = 0;
for (Integer num : list) {
if (filter.test(num)) {
sum += num;
}
}
return sum;
}
public static void main(String[] args) {
List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
int sum;
sum = filterSum(i -> i % 2 == 0, list);
System.out.println("μ§μ ν©: " + sum);
sum = filterSum(i -> i % 2 == 1, list);
System.out.println("νμ ν©: " + sum);
}
}
• Supplier<T>
μ μ¬μ§μ Supplier<T> μ λ΄λΆ μ½λ μ λλ€.
β
μΈν°νμ΄μ€λ λ€μκ³Ό κ°μ μΆμλ©μλκ° μ‘΄μ¬ν©λλ€.
T get(); // 맀κ°λ³μκ° μκ³ , λ¨μν 무μμΈκ°λ₯Ό λ°νν λ
λ€λ₯Έ ν¨μν μΈν°νμ΄μ€λ€μ μΆμλ©μλλ λͺ¨λ 맀κ°λ³μλ₯Ό λ°μλλ°,
Supplier<T> λ νΉμ΄νκ² λ§€κ°λ³μλ₯Ό λ°μ§ μκ³ λ¨μν 무μμΈκ°λ₯Ό λ°ννλ μΆμλ©μλκ° μ‘΄μ¬ν©λλ€.
β
package other;
import java.util.function.Supplier;
public class SupplierExample {
public static void main(String[] args) {
Supplier<String> helloSupplier = () -> "Hello ";
System.out.println(helloSupplier.get() + "World");
}
}
μ μ½λμμ Supplier<T>μ μ λ€λ¦ νμ μ String μ΄λ―λ‘, helloSupplier.get() μ ν΅ν΄ "Hello " λ₯Ό λ°μμ¬ μ μμ΅λλ€.
β
β
Supplier<T> μΈν°νμ΄μ€λ μΆμ λ©μλ get()μ ν΅ν΄ Lazy Evaluation μ΄ κ°λ₯ν©λλ€.
Lazy Evaluation μ§μμ "κ²μΌλ₯Έ μ°μ°"μΌλ‘, λΆνμν μ°μ°μ νΌνκΈ° μν΄ μ°μ°μ μ§μ°μν€λ κ²μ λ§ν©λλ€.β μ¦, λΆνμν μ°μ°μ νΌνλ€ λ μλ―Έμ λλ€. |
Lazy Evaluationμ ν΅ν΄ ν¨μ¨μ μΈ λμμ μ΄λμ΄ λΌ μ μλ μ½λλ₯Ό μμλ³΄κ² μ΅λλ€.
getVeryExpensiveValue() λ©μλλ 3μ΄κ° sleep ν "JuHyun" μ 리ν΄νλ ν¨μμ΄κ³ ,
printIfValidIndex(int number, String value) λ©μλλ 쑰건μλ°λΌ μΆλ ₯μ λ¬λ¦¬νλ ν¨μμ λλ€.
β
μ ν¨μμμ numberμ κ°μ κ΄κ³ μμ΄ λ©μλκ° μ΄ 3λ² νΈμΆμ΄ λκΈ° λλ¬Έμ 9μ΄κ° κ²½κ³Όνκ² λ©λλ€.
μ΄μ μ μ½λλ₯Ό Supplier<T> μΈν°νμ΄μ€λ₯Ό ν΅ν΄ Lazy Evaluation λΆνμν μ°μ°μ μ€μ¬λ³΄λλ‘ νκ² μ΅λλ€.
μμ κ²½μ°μλ printInfValidIndex() λ©μλμ 맀κ°λ³μλ‘ λ©μλμ λ°νκ°μ΄ μλ, ν¨μκ° μ λ¬λμκΈ° λλ¬Έμ μ€μ μ μΌλ‘ valueSupplier.get() μ νΈμΆν λλ§ getVeryExpensiveValue() λ©μλλ₯Ό νΈμΆνκ² λ©λλ€.
β
μ μ½λμ κ²°κ³Όλ₯Ό 보면 μ€μ μ μΌλ‘ λΆνμν μ°μ°μ μ κ±°νκ³ , κ²°κ³Όκ° 3μ΄λ‘ λμ€λκ²μ νμΈν μ μμ΅λλ€.
β
μ΄μμΌλ‘ Java8μ μΆκ°λ λνμ μΈ ν¨μν μΈν°νμ΄μ€λ₯Ό μ΄ν΄λ³΄μμ΅λλ€.
β
β References
https://codechacha.com/ko/java8-functional-interface/
β
β
β
http://m.yes24.com/goods/detail/43755519
β
https://docs.oracle.com/javase/8/docs/api/
'Java' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
[Java] - κΉμ 볡μ¬(Deep Copy) vs μμ 볡μ¬(Shallow Copy) (1) | 2021.07.30 |
---|---|
[Java] - Project Lombok(둬볡) (0) | 2021.06.20 |
[Java] - Jsoupμ μ΄μ©ν ν¬λ‘€λ§(feat. μΈνλ°) (5) | 2021.05.11 |
[Java] - μμΈ(Exception), μμΈ μ²λ¦¬(Exception Handling) (2) | 2021.05.08 |
[Java] - μλ° μ κ· ννμ(Regular Expression) + 2021 μΉ΄μΉ΄μ€ μ½ν (μ κ· μμ΄λ μΆμ²) (0) | 2021.03.28 |
λκΈ