π μλ°μ μ μμ μ 리ν λ΄μ©μ λλ€.
βͺ λλ€μLambda Expression
μλ°λ λ λ²μ ν° λ³νκ° μμλ€. JDK1.5μ μ§λ€λ¦μ€. JDK1.8μ λλ€.
λλ€μ λ±μ₯μΌλ‘ κ°μ²΄μ§ν₯μΈμ΄λ₯Ό λλ¨Έ ν¨μν μΈμ΄κ° κ°μ§ κΈ°λ₯κΉμ§ κ°μΆκ² λμλ€.
λ§νμλ©΄ λΉλ‘μ νΈλͺ¨ μ¬νΌμμ€μ κΈΈμ μ μ΄λ κ²μΌκΉ?
λλ€μμ΄λ κ°λ¨ν λ©μλλ₯Ό νλμ μμΌλ‘ ννν κ²μ΄λ€.
ν¨μλ₯Ό κ°λ΅νλ©΄μλ λͺ νν μμΌλ‘ νΈν μ μλ€.
λ©μλλ₯Ό λλ€μμΌλ‘ νννλ©΄ λ°ν κ°μ΄ μμ΄μ§λ€. κ·Έλμ μ΅λͺ ν¨μλΌκ³ λΆλ₯΄κΈ°λ νλ€.
κ·Έλμ μ΄λ»κ² μ°λ κ±°λλ©΄.
int max(int a, int b) {
return a > b ? a:b;
}
λ κ°μ μ
λ ₯λ°κ³ ν° κ°μ λ°ννλ maxλΌλ λ©μλκ° μλ€.
μ΄κ²μ λλ€λ‘ λ³ννλ©΄ μ΄λ κ² μΈ μ μλ€.
(int a, int b) -> a > b ? a : b
//맀κ°λ³μ νμ
μ΄ κ°μ κ²½μ° νμ
μ μλ΅ν μ μλ€.
(a,b) -> a > b ? a:b
μ΄λ κ² λ°νκ°μ΄ μλ κ²½μ° returnλ¬Έμ μμΌλ‘ λ체ν μ μλ€. μ°μ° κ²°κ³Όλ₯Ό returnνλ€.
λ¬Έμ₯μ΄ μλλΌ 'μexpression'μ΄λ―λ‘ ';'μ λΆμ΄μ§ μλλ€.
λ§μ½, 맀κ°λ³μκ° νλλΌλ©΄ 맀κ°λ³μλ₯Ό κ°μΈλ κ΄νΈλ μλ΅ν μ μλ€.
i -> i * i
λ©μλ -> λλ€
Method | Lambda |
---|---|
int max(int a, int b) { return a > b ? a : b ; } |
(a,b)-> a > b ? a : b |
void printVar(String name, int i) { System.out.println(name + "="+i); } |
(name, i) -> System.out.println(name + "="+i) |
int square(int x) { return x * x; } | x-> x * x |
int roll() { return (int)(Math.random()*6);} | ()->(int)(Math.random() * 6) |
int sumArr(int[] arr) { int sum=0; for(int i : arr){sum += i;} return sum; } |
(int[] arr) -> { int sum = 0; for(int i : arr){ sum += i;} return sum; } |
βͺ ν¨μν μΈν°νμ΄μ€Functional Interface
λλ€λ μ΅λͺ ν΄λμ€ κ°μ²΄μ λλ±νλ€.
new Object() {
int max(int a, int b) {
return a > b ? a : b;
}
}
μ΄ μ½λμ
(a,b) -> a > b ? a : b ;
μ΄ μ½λκ° λλ±νλ€λ λ»μ΄λ€.
κ·Έλ λ€λ©΄ λλ€λ‘ μ μλ μ΅λͺ κ°μ²΄μ λ©μλλ₯Ό μ΄λ»κ² νΈμΆνλ €λ©΄ κ°μ²΄μ μ£Όμλ₯Ό μ μ₯ν μ°Έμ‘°λ³μκ° νμνλ€.
νμ
f = (int a, int b) -> a > b ? a : b;
μ΄λ€ νμ μ΄ μ¬ μ μμκΉ?
쑰건
- λλ€μκ³Ό κ°μ λ©μλκ° μ μλμ΄ μμ΄μΌ νλ€.
κ·ΈλμΌλ§ μ°Έμ‘°λ³μλ₯Ό μ΄μ©ν΄ λλ€μμ νΈμΆν μ μλ€.
interface MyFuntion {
public abstract int max(int a, int b);
}
μ΄λ° μΈν°νμ΄μ€κ° μλ€κ³ νμ. μ΄κ²μ μ΅λͺ ν΄λμ€λ‘λ ꡬννλ€λ©΄ μ΄λ κ² ν κ²μ΄λ€.
MyFunction f = new MyFunction() {
public int max(int a, int b) {
return a > b ? a : b;
}
}
int big = f.max(5,3);
μ μ΅λͺ ν΄λμ€λ₯Ό λλ€λ‘ λ체ν μ μλ€.
MyFunction f = (a, b) -> a > b ? a : b;
int big = f.max(5,3); //λ©μλ νΈμΆ
μ΅λͺ
κ°μ²΄λ₯Ό λλ€λ‘ λ체 κ°λ₯ν μ΄μ λ λλ€μλ μ€μ λ‘λ μ΅λͺ
κ°μ²΄μ΄κΈ° λλ¬Έμ΄λ€.
νλμ λ©μλκ° μ μΈλ μΈν°νμ΄μ€λ₯Ό μ μν λ€μ λλ€λ₯Ό λ€λ£¨λ κ²μ κΈ°μ‘΄μ μλ° κ·μΉμ μ΄κΈ°μ§ μμΌλ©΄μ μμ°μ€λ½λ€.
κ·Έλμ μΈν°νμ΄μ€λ₯Ό ν΅ν΄ λλ€λ₯Ό λ€λ£¨κΈ° μμνλ€. μ΄λ° μΈν°νμ΄μ€λ₯Ό ν¨μν μΈν°νμ΄μ€functional interfaceλΌκ³ νλ€. μΈν°νμ΄μ€ μ μΈλΆμ λ¨μν μ΄λ
Έν
μ΄μ
νλ μΆκ°νλ κ² λ§κ³ λ κΈ°μ‘΄κ³Ό λ€λ₯΄μ§ μλ€. μ 짧μ μμ μμ 보μλ―μ΄ μμ΄λ μκ΄μ μμ§λ§ μ»΄νμΌλ¬μμ νμΈν΄μ£Όλ―λ‘ λΆμ΄λ κ²μ΄ μ’λ€.
@FunctionalInterface
-
μ€μ§ νλμ μΆμλ©μλλ§ μ μν μ μλ€.
μΈν°νμ΄μ€μ λ©μλμ λλ€λ₯Ό 1:1λ‘ μ°κ²°νκΈ° μν΄μ. -
staticλ©μλμ defaultλ©μλμ κ°μλ μ μ½μ΄ μλ€.
μ΅λͺ ν΄λμ€μ λλ€ λΉκ΅
//μ΅λͺ
ν΄λμ€
Collections.sort(list, new Comparator<String>() {
public int compare(String s1, String s2) {
return s2.compareTo(s1);
}
}
//λλ€
Collections.sort(list, (s1, s2) -> s2.compareTo(s1))
FunctionalInterfaceνμ 맀κ°λ³μμ λ°ννμ
-
λ©μλμ 맀κ°λ³μκ° ν¨μν μΈν°νμ΄μ€νμ μ΄λ©΄, νΈμΆ μ λλ€(λλ μ°Έμ‘°λ³μ)λ₯Ό μΈμλ‘ μ λ ₯ν΄μΌ νλ€.
@FunctionalInterface interface MyFunction { void myMethod(); //μΆμλ©μλ } ... void aMethod(MyFunction f) { f.myMethod(); } ----------------------------------------- //ꡬνκ³Ό λμμ νΈμΆ aMethod(() -> System.out.println("myMethod()"));
-
λ°ννμ μ΄ ν¨μν μΈν°νμ΄μ€νμ μ΄λΌλ©΄, λλ€λ₯Ό returnνλ€.
MyFunction myMethod() { //λ°ννμ μ΄ ν¨μν μΈν°νμ΄μ€λΌλ©΄, λλ€λ₯Ό returnνλ€. return () -> System.out.println("myMethod()"); }
β» λλ€μ νμ κ³Ό νλ³ν
λλ€μ νμ μ΄ ν¨μν μΈν°νμ΄μ€ νμ κ³Ό μΌμΉνλ κ²μ μλλ€. λ€λ§ ν¨μν μΈν°νμ΄μ€λ‘ λλ€λ₯Ό μ°Έμ‘°νλ κ² λΏμ΄λ€. λλ€μμ μ΅λͺ κ°μ²΄μ΄λ―λ‘ νμ μ΄ μλ€.
MyFunction f = (MyFunction)(() ->{}); //μΈν°νμ΄μ€ νμ κ³Ό, λλ€ νμ μ΄ λ€λ₯΄λ―λ‘ νλ³ν νμ
νμ§λ§ μμ μ»΄νμΌλ¬κ° λμ ν΄μ€λ€.
λλ€λ μ΄λ¦λ§ μμ λΏ κ°μ²΄λ€. κ·Έλ¬λ Objectνμ
μΌλ‘ νλ³ν ν μ μλ€.
κ΅³μ΄ νλ €λ©΄ λ¨Όμ MyFunctionμΌλ‘ νλ³νν΄μΌ νλ€.
Object obj = ((Object)(MyFunction))(()->{})).toString();
β μΈλΆ λ³μλ₯Ό μ°Έμ‘°νλ λλ€μ
λλ€μλ μ΅λͺ κ°μ²΄μ΄λ―λ‘ μΈλΆμ μ μΈλ λ³μμ μ κ·Όνλ λ°©μμ μ΅λͺ ν΄λμ€μ λμΌνλ€.
package com.javaex.lambda;
public class LambdaEx3 {
public static void main(String[] args) {
Outer outer = new Outer();
Outer.Inner inner = outer.new Inner();
inner.method(100);
}
}
@FunctionalInterface
interface MyFunction{
void myMethod();
}
class Outer {
int val = 10; //Outer.this.val
class Inner {
int val = 20; //this.val
void method(int i) { //(final int i)
int val = 30; //final int val = 30;
// i = 10; //finalμ΄λ―λ‘ λ³κ²½ λΆκ°
MyFunction f = () -> {
System.out.println("i : "+ i);
System.out.println("val : " + val);
System.out.println("this.val : " + ++this.val);
System.out.println("Outer.this.val : " + Outer.this.val);
};
f.myMethod();
}
}
}
λλ€μ λ΄μμ μ°Έμ‘°νλ μ§μλ³μλ finalμ΄ λΆμ§ μμμ΄λ finalλ‘ κ°μ£Όνλ€.
π¦ java.util.function
λ©μλ ν¨ν΄μ λκ° λΉμ·νλ€.
- 맀κ°λ³μκ° μκ±°λ, νλ λλ λ κ°
- returnμ μκ±°λ μκ±°λ
μ λ€λ¦μ μ¬μ©νλ©΄ λ°ννμ λ λ¬Έμ λμ§ μλλ€.
java.util.packageμλ μμ£Ό μ°μ΄λ νμμ λ©μλλ€μ΄ μ μλμ΄ μλ€. λ μλ‘μ΄ ν¨μν μΈν°νμ΄μ€λ₯Ό μ°λ κ²λ³΄λ€ μ΄ ν¨ν€μ§μ μΈν°νμ΄μ€λ₯Ό νμ©νλ κ²μ΄ λ©μλ μ΄λ¦ ν΅μΌ, μ¬μ¬μ©μ±, μ μ§λ³΄μ μΈ‘λ©΄μμ λͺ¨λ μ’λ€.
맀κ°λ³μκ° νλμΈ ν¨μν μΈν°νμ΄μ€
μ΄λ―Έμ§ μΆμ² : μλ°μ μ μ
4κ°μ ν¨μν μΈν°νμ΄μ€κ° μλ€.
쑰건μμμ Predicate
Predicateλ Functionμ λ³νμ΄λ€. λ°νκ°μ΄ booleanμ΄λΌλ μ μ΄ λ€λ₯΄λ€. μνμμ true λλ falseλ₯Ό λ°ννλ ν¨μλ₯Ό PredicateλΌκ³ λΆλ₯Έλ€. 쑰건μμ λλ€μμΌλ‘ ννν λ μ¬μ©νλ€.
Predicate<String> isEmptyStr = s -> s.length() == 0;
String s = "";
if(isEmptyStr.test(s)) { //if(s.length() == 0)
....
}
맀κ°λ³μκ° λ κ°μΈ ν¨μν μΈν°νμ΄μ€
μ΄λ―Έμ§ μΆμ² : μλ°μ μ μ
BiSupplierκ° μλ μ΄μ λ 맀κ°λ³μλ μκ³ λ°νκ°λ§ μ‘΄μ¬νλλ° λ©μλλ λ κ°μ κ°μ λ°νν μ μκΈ° λλ¬Έμ΄λ€.
λ§μ½ μ΄ μΈμ λ κ° μ΄μμ 맀κ°λ³μλ₯Ό κ°μ§λ ν¨μν μΈν°νμ΄μ€κ° νμνλ€λ©΄ μ§μ λ§λ€μ΄ μ¨μΌ νλ€.
@FunctionalInterface
interface TriFunction<T,U,V,R> {
R apply(T t, U u, V v);
}
UnaryOperatorμ BinaryOperator
Functionμ λ λ€λ₯Έ λ³νμ΄λ€. 맀κ°λ³μμ νμ κ³Ό λ°ννμ μ΄ μΌμΉνλ€λ μ μ΄ λ€λ₯΄λ€.
CollectionFramework & Functional Interface
컬λ μ νλ μμν¬ μΈν°νμ΄μ€μ μ μΈλ λν΄νΈ λ©μλ μ€ μΌλΆλ ν¨μν μΈν°νμ΄μ€λ₯Ό μ¬μ©νλ€.
Interface | Method | μ€λͺ |
---|---|---|
Collection | boolean removeAll(Predicate<E> filter) | 쑰건μ λ§λ μμ μμ |
List | void replaceAll(UnaryOperator<E> operator) | λͺ¨λ μμλ₯Ό λ³ννμ¬ λ체 |
Iterable | void forEach(Consumer<T> action) | λͺ¨λ μμμ μμ actionμ μν |
Map | V compute(K key, BiFunction<K,V,V> f) V computeIfAbsent(K key, Function<K,V> f) V computeIfPresent(K key Function<K,V> f) V merge(K key, V value, BiFunction<V,V,V> f) void forEach(BiConsumer<K,V> action) void replaceAll(BiFunction<K,V,V> f) |
μ§μ ν ν€μ κ°μ μμ
fλ₯Ό μν ν€κ° μμΌλ©΄ μμ f μν ν μΆκ° μ§μ ν ν€κ° μμ λ μμ f μν λͺ¨λ μμμ λ³ν©μμ fλ₯Ό μν λͺ¨λ μμμ μμ actionμ μν λͺ¨λ μμμ μΉνμμ fλ₯Ό μν |
package com.javaex.lambda;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class LambdaEx4 {
public static void main(String[] args) {
List<Integer> list = new ArrayList<>();
for (int i = 0; i < 10; i ++) {
list.add(i);
}
//listμ λͺ¨λ μμ μΆλ ₯
list.forEach(i -> System.out.println(i));
//listμμ 2 λλ 3μ λ°°μ μ κ±°
list.removeIf(x -> x%2==0 || x%3==0); //removeIf(Predicate<E> filter)
System.out.println(list);
//listμ κ° μμμ 10μ κ³±νλ€.
list.replaceAll(i -> i*10); //void replaceAll(UnaryOperator<E> operator)
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");
//void forEach(BiConsumer<K,V> action)
map.forEach((k,v) -> System.out.println("["+k+","+v+"]"));
}
}
κ·Έλ¦¬κ³ μμμ μ€λͺ
ν ν¨μν μΈν°νμ΄μ€λ₯Ό μ¬μ©νλ μμ λ€.
μ¬μ΄ λ― ν·κ°λ €μ μ£Όμμ κΌΌκΌΌν λ¬μλ€.
package com.javaex.lambda;
import java.util.ArrayList;
import java.util.List;
import java.util.function.Consumer;
import java.util.function.Function;
import java.util.function.Predicate;
import java.util.function.Supplier;
public class LambdaEx5 {
public static void main(String[] args) {
/*Suplier<T>λ 맀κ°λ³μλ μκ³ λ°νκ°λ§ μλ ν¨μν μΈν°νμ΄μ€λ€.
μΆμλ©μλ T get()κ° 1 ~ 100 μ¬μ΄ μμμ μλ₯Ό 리ν΄νλλ‘ κ΅¬ννλ€.*/
Supplier<Integer> supplier = () -> (int)(Math.random()*100) + 1;
/*Consumer<T>λ 맀κ°λ³μλ§ μκ³ λ°νκ°μ΄ μλ ν¨μν μΈν°νμ΄μ€λ€.
* void accept(T t)λ₯Ό μ
λ ₯ λ°μ 맀κ°λ³μλ₯Ό μΆλ ₯νλλ‘ κ΅¬ννμλ€.
* */
Consumer<Integer> consumer = i -> System.out.print(i + ",");
/*
* Predicate<T>λ νλμ 맀κ°λ³μλ₯Ό μ
λ ₯ λ°κ³ , booleanμ returnνλ ν¨μν μΈν°νμ΄μ€λ€.
* boolean test(T t)λ₯Ό μ
λ ₯ λ°μ tκ° 2μ λ°°μ(i%2==0)λΌλ©΄ true μλλΌλ©΄ falseλ₯Ό μΆλ ₯νλλ‘ κ΅¬ννμλ€.
* */
Predicate<Integer> predicate = i -> i%2==0;
/*
* Function<T,R>μ νλμ 맀κ°λ³μTλ₯Ό λ°μ νλμ κ²°κ³ΌRλ₯Ό μΆλ ₯νλ€.
* R apply(T t)λ₯Ό μ
λ ₯ λ°μ tμ μΌμ μ리λ₯Ό μμ λλ‘ κ΅¬ννμλ€.
* */
Function<Integer, Integer> function = i -> i/10*10; //iμ μΌμ μ리λ₯Ό μμ€λ€.
List<Integer> list = new ArrayList<>();
//listμ 10κ°μ λμλ₯Ό μ μ₯νλ€.
makeRandomList(supplier, list);
//νμΈ
System.out.println(list);
//listμ μ μ₯λ κ° μ€μ, 2μ λ°°μμΈ κ²λ§ μΆλ ₯νλ€
printEvenNum(predicate, consumer, list);
//listμ μ μ₯λ κ°λ€μ μΌμ μ리λ₯Ό μμ μ Listλ₯Ό returnνλ λ©μλ
List<Integer> newList = doSomething(function, list);
System.out.println(newList);
}
static <T> List<T> doSomething(Function<T,T> f, List<T> list) {
List<T> newList = new ArrayList<>();
/*listμ μ μ₯λ κ°μ iμ λμ
νλ€.
* iμ λμ
λ κ°μμ μΌμ μ리λ₯Ό μμ κ³ f.apply(i) newListμ μ μ₯νλ€.
* */
for (T i : list) { newList.add(f.apply(i)); }
//listμ κ°λ€μ μΌμ μλ¦¬λ§ μμ€ μ±λ‘ return
return newList;
}
static <T> void printEvenNum(Predicate<T> p, Consumer<T> c, List<T> list) {
System.out.print("[");
/*
* μ
λ ₯ listμ κ°μ νλμ© iμ λμ
νλ€.
* κ·Έ μ€μ 2μ λ°°μμΈ κ²λ§ Consumer<T> cμ λ΄λλ€.
* accept()λ 맀κ°λ³μ μΈμλ‘ λ°μ iλ₯Ό μΆλ ₯νλ€.
* */
for (T i : list ) {
if (p.test(i)) {
c.accept(i);
}
}
System.out.println("]");
}
//μ
λ ₯λ°μ listμ λμ μ΄ κ°λ₯Ό μ μ₯νλ€.
static <T> void makeRandomList(Supplier<T> s, List<T> list) {
for (int i=0; i<10; i++) {
/*
* λ°λ³΅λ¬Έμ λλ©΄μ
* s.get()μ νΈμΆν λλ§λ€
* 1 ~ 100 μ¬μ΄ μμμ μλ₯Ό μΆλ ₯νλ€.
* */
list.add(s.get());
}
}
}
κΈ°λ³Ένμ μ¬μ©νλ ν¨μν μΈν°νμ΄μ€
μ μμ λ₯Ό κΈ°λ³Ένμ μ¬μ©νλ ν¨μν μΈν°νμ΄μ€λ‘ λ°κΎΌ κ²μ΄λ€.
μ£Όμμ μμ μμΈνκ² λ¬μμΌλ―λ‘ μλ΅νλ€.
package com.javaex.lambda;
import java.util.Arrays;
import java.util.function.IntConsumer;
import java.util.function.IntPredicate;
import java.util.function.IntSupplier;
import java.util.function.IntUnaryOperator;
public class LambdaEx6 {
public static void main(String[] args) {
IntSupplier s = () -> (int)(Math.random() * 100) + 1;
IntConsumer c = i -> System.out.print(i + ",");
IntPredicate p = i -> i%2==0;
IntUnaryOperator op = i -> i/10*10; //μΌμ μ리 μμ€λ€.
int[] arr = new int[10];
makeRandomList(s, arr);
System.out.println(Arrays.toString(arr));
printEvenNum(p, c, arr);
int[] newArr = doSomething(op, arr);
System.out.println(Arrays.toString(arr));
}
static void makeRandomList(IntSupplier s, int[] arr) {
for (int i = 0; i<arr.length;i++){
arr[i] = s.getAsInt(); //getμ΄ μλλΌ getAsInt()
}
}
static void printEvenNum (IntPredicate p, IntConsumer c, int[] arr) {
System.out.print("[");
for (int i : arr ) {
if (p.test(i)) {
c.accept(i);
}
} //for
System.out.print("]");
System.out.println();
} // end printEvenNum
static int[] doSomething(IntUnaryOperator op, int[] arr) {
int[] newArr = new int[arr.length];
for (int i = 0; i < newArr.length; i++) {
newArr[i] = op.applyAsInt(arr[i]); //apply()μλ
}
return newArr;
}
}
'Java' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
μμΈμ²λ¦¬ (0) | 2020.09.10 |
---|---|
Stream (0) | 2020.09.10 |
μ λ€λ¦ λ©μλGeneric Method (0) | 2020.09.09 |
μμΌλμΉ΄λ (0) | 2020.09.09 |
μ λ€λ¦ ν΄λμ€Generics Class (0) | 2020.09.09 |