July 29, 2021
int[] arr = new int[5];
Arrays.setAll(arr, (i) -> (int)(Math.random() * 5) + 1);
(i) -> (int)(Math.random() * 5) + 1
μ΄ λ°λ‘ λλ€μμ΄λ€. μ΄ λλ€μμ΄ νλ μΌμ λ©μλλ‘ νννλ©΄ μλμ κ°λ€.int method() {
return (int)(Math.random()*5) + 1;
}
μ₯μ μ?
->
λ₯Ό μΆκ°νλ€.λ°ννμ
λ©μλμ΄λ¦ (맀κ°λ³μ μ μΈ) {
λ¬Έμ₯λ€
}
(맀κ°λ³μ μ μΈ) {
λ¬Έμ₯λ€
}
ex) λ κ° μ€μμ ν° κ°μ λ°ννλ λ©μλ maxλ₯Ό λλ€μμΌλ‘ λ³ννλ©΄ λ€μκ³Ό κ°μ΄ λ³νκ° μ΄λ£¨μ΄μ§λ€.
λλ€μ¬μ©X
int max (int a, int b) {
return a > b ? a : b;
}
λλ€μ¬μ©O
(int a, int b) -> {
return a > b ? a : b;
}
λ°νκ°μ΄ μλ λ©μλμ κ²½μ°, returnλ¬Έ λμ βμ(expression)μΌλ‘ λμ ν μ μλ€. μμ μ°μ°κ²°κ³Όκ° μλμ μΌλ‘ λ°νκ°μ΄ λλ€.μ΄ λλ βλ¬Έμ₯(statement)βμ΄ μλ βμβμ΄λ―λ‘ λμ β;β μ λΆμ΄μ§ μλλ€.
(int a, int b) -> {return a > b ? a : b;}
;
λ μλ΅ν¨(int a, int b) -> a > b ? a : b
λλ€μμ μ μΈλ 맀κ°λ³μμ νμ μ μΆλ‘ μ΄ κ°λ₯ν κ²½μ°λ μλ΅ν μ μλλ°, λλΆλΆμ κ²½μ°μλ μλ΅κ°λ₯νλ€. λλ€μμ λ°ννμ μ΄ μλ μ΄μ λ νμ μΆλ‘ μ΄ κ°λ₯νκΈ° λλ¬Έμ΄λ€.
(int a, int b) -> a > b ? a : b
(a, b) -> a > b ? : a : b
(int a, b) -> a > b ? a : b
μ κ°μ΄ λ 맀κ°λ³μ μ€ μ΄λ νλμ νμ
λ§ μλ΅νλ κ²μ νμ©λμ§ μλλ€.μ μΈλ 맀κ°λ³μκ° νλλΏμΈ κ²½μ°μλ κ΄νΈ()λ₯Ό μλ΅ν μ μλ€. λ¨, 맀κ°λ³μμ νμ μ΄ μμΌλ©΄ κ΄νΈ()λ₯Ό μλ΅ν μ μλ€.
κ΄νΈ() μλ΅ μ
(a) -> a * a
(int a) -> a * a
κ΄νΈ() μλ΅ ν
a -> a * a // OK
int a -> a * a // Error
κ΄νΈ{}μμ λ¬Έμ₯μ΄ νλμΌ κ²½μ°λ€λ κ΄νΈ{}λ₯Ό μλ΅ν μ μλ€. μ΄ λ λ¬Έμ₯μ λμ ;
λ₯Ό λΆμ΄μ§ μμμΌ νλ€λ κ²μ μ£Όμ
(String name, int i) -> {
System.out.println(name+"="+i);
}
;
μλ΅ν¨(String name, int i) ->
System.out.println(name+"="+i)
(int a, int b) -> { return a > b ? a : b;} // OK
(int a, int b) -> return a > b ? a : b // Error
λ©μλλ₯Ό λλ€μμΌλ‘ λ³ν μ°μ΅1
int max (int a, int b) {
return a > b ? a : b;
}
(int a, int b) -> { return a > b ? a : b;}
(int a, int b) -> a > b ? a : b
(a, b) -> a > b ? a : b
λ©μλλ₯Ό λλ€μμΌλ‘ λ³ν μ°μ΅2
λ©μλ
void printVar (String name, int i) {
System.out.println(name + "=" + i);
}
λλ€μμΌλ‘ νν1
(String name, int i) -> {System.out.println(name + "=" + i);}
λλ€μμΌλ‘ νν2
(name, i) -> {System.out.println(name + "=" + i);}
λλ€μμΌλ‘ νν3
(name, i) -> System.out.println(name + "=" + i)
λ©μλλ₯Ό λλ€μμΌλ‘ λ³ν μ°μ΅3
int squre (int x) {
return x * x;
}
(int x) -> x * x
(x) -> x * x
x -> x * x
λ©μλλ₯Ό λλ€μμΌλ‘ λ³ν μ°μ΅4
int roll() {
return (int) (Math.random() * 6);
}
() -> {return (int) Math.random() * 6;}
() -> (int) Math.random() * 6
λ©μλλ₯Ό λλ€μμΌλ‘ λ³ν μ°μ΅5
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;
}
λλ€μμ μ΅λͺ ν΄λμ€μ κ°μ²΄μ λμΌνλ€.
κ·Έλμ μλμ λλ€μμ μ¬μ€ μ΅λͺ ν΄λμ€μ κ°μ²΄λ‘ ννκ°λ₯νλ€.
λλ€λ‘
(int a, inb b) -> a > b ? a : b;
μ΅λͺ ν΄λμ€μ κ°μ²΄λ‘
new Object() {
int max (int a, int b) {
return a > b ? a : b;
}
}
νμ
f = (int a, int b) -> a > b ? a : b; // μ°Έμ‘°λ³μμ νμ
μ λλ‘ ν΄μΌ ν κΉ?
interface MyFunction {
public abstract int max(int a, int b);
}
κ·Έλ¬λ©΄ μ΄ μΈν°νμ΄μ€λ₯Ό ꡬνν μ΅λͺ ν΄λμ€μ κ°μ²΄λ λ€μκ³Ό κ°μ΄ μμ± κ°λ₯
MyFunction f = new Function() {
public int max(int a, int b) {
return a > b ? a : b;
};
}
int big = f.max(3, 5); // μ΅λͺ
κ°μ²΄μ ν΄λμ€λ₯Ό νΈμΆ
κ·Έλ°λ° μμ MyFunctionμΈν°νμ΄μ€μ μ μλ λ©μλ max()λ λλ€μ (int a, int b) -> a > b ? a : b
κ³Ό λ©μλμ μ μΈλΆκ° μΌμΉνλ€. κ·Έλμ μ μ½λμ μ΅λͺ
κ°μ²΄λ₯Ό λλ€μμΌλ‘ μλμ κ°μ΄ λ체ν μ μλ€.
MyFunction f = (int a, int b) -> a > b ? a : b; // μ΅λͺ
κ°μ²΄λ₯Ό λλ€μμΌλ‘ λ체
ing big = f.max(5, 3); // μ΅λͺ
κ°μ²΄μ λ©μλλ₯Ό νΈμΆ
ν¨μν μΈν°νμ΄μ€(functional interface)
λΌκ³ λΆλ₯΄κΈ°λ‘ ν κ².@FunctionalInterface
interface MyFunction { // ν¨μν μΈν°νμ΄μ€ MyFunctionμ μ μ
public abstract int max(int a, int b);
}
μ μ½) λ¨, ν¨μν μΈν°νμ΄μ€μλ μ€μ§ νλμ μΆμ λ©μλλ§ μ μλμ΄ μμ΄μΌ νλ€. κ·ΈλμΌ λλ€μκ³Ό μΈν°νμ΄μ€μ λ©μλκ° 1:1λ‘ μ°κ²°λ μ μκΈ° λλ¬Έ. λ°λ©΄μ staticλ©μλμ defaultλ©μλμ κ°μμλ μ μ½μ΄ μλ€.
@FunctionalInterface
λ₯Ό λΆμ΄λ©΄, μ»΄νμΌλ¬κ° ν¨μν μΈν°νμ΄μ€λ₯Ό μ¬λ°λ₯΄κ² μ μνμλμ§ νμΈν΄μ£Όλ―λ‘, κΌ λΆμ΄μList<String> list = Arrays.asList("abc", "aaa", "bbb", "ddd", "aaA");
Collections.sort(list, new Comparator<String>(){
public int compare(String s1, String s2) {
return s2.compareTo(s1);
}
});
List<String> list = Arrays.asList("abc", "aaa", "bbb", "ddd", "aaa");
Collections.sort(list, (s1, s2) -> s2.compareTo(s1));
@FunctionalInterface
interface MyFunction {
void myMethod(); // μΆμλ©μλ
}
void aMethod(MyFunction f) {
f.myMethod();
}
...
MyFunction f = () -> System.out.println("myMethod()");
aMethod(f);
aMethod(() -> System.out.println("myMethod()")); // λλ€μμ 맀κ°λ³μλ‘ μ§μ
MyFunction myMethod() {
MyFunction f = () -> {};
return f; // μ΄ μ€κ³Ό μ μ€μ ν μ€λ‘ μ€μ΄λ©΄, return () -> {};
}
@FunctionalInterface
interface MyFunction {
void run();
}
class LambdaEx1 {
static void execute(MyFunction f) { // 맀κ°λ³μμ νμ
μ΄ MyFunctionμΈ λ©μλ
f.run();
}
static MyFunction getMyFunction() { // λ°ν νμ
μ΄ MyFunctionμΈ λ©μλ
MyFunction f = () -> System.out.println("f3.run()");
return f;
}
public static void main(String[] args) {
// λλ€μμΌλ‘ MyFunctionμ run() μ ꡬν
MyFunction f1 = () -> System.out.println("f1.run()");
MyFunction f2 = new MyFunction() { // μ΅λͺ
ν΄λμ€λ‘ run()μ ꡬν
public void run() { // publicμ λ°λμ λΆμ¬μΌ ν¨
System.out.println("f2.run()");
}
};
MyFunction f3 = getMyFunction();
f1.run();
f2.run();
f3.run();
execute(f1);
execute(() -> System.out.println("run()"));
}
}
/////////////////////////////////
(μΆλ ₯)
f1.run()
f2.run()
f3.run()
f1.run()
run()
interface MyFunction {void method();}
μ κ°μ΄ μ μλμλ€κ³ κ°μ νμλ€.MyFunction f = (MyFunction) (() -> {}); // μλ³μ νμ
μ΄ λ€λ₯΄λ―λ‘ νλ³νμ΄ νμ
Object object = (Object) (() -> {}); // μλ¬. ν¨μν μΈν°νμ΄μ€λ‘λ§ νλ³ν κ°λ₯
Object obj = (Object)(MyFunction) (() -> {});
String str = ((Object)(MyFunction) (() -> {})).toString();
@FunctionalInterface
interface MyFunction {
void myMethod(); // public abstract void myMethod();
}
public class LambdaEx2 {
public static void main(String[] args) {
MyFunction f = () -> {}; // MyFunction f = (MyFunction)(() -> {});
Object obj = (MyFunction) (() -> {}); // Object νμ
μΌλ‘ νλ³νμ΄ μλ΅λ¨
String str = ((Object)(MyFunction)(() -> {})).toString();
System.out.println(f); // LambdaEx2$$Lambda$1/1324119927@3d075dc0
System.out.println(obj); // LambdaEx2$$Lambda$2/1078694789@214c265e
System.out.println(str); // LambdaEx2$$Lambda$3/1831932724@682a0b20
// System.out.println(() -> {}); // μλ¬. λλ€μμ Objectνμ
μΌλ‘ νλ³ν μλ¨
System.out.println((MyFunction)(() -> {})); // LambdaEx2$$Lambda$4/1149319664@7cca494b
// System.out.println((MyFunction)(() -> {}).toString()); // μλ¬
System.out.println(((Object)(MyFunction)(() -> {})).toString()); // LambdaEx2$$Lambda$5/2074407503@3b9a45b3
}
}
μμ 14-2) μμ λ³Ό μ μλ―μ΄ μ€νκ²°κ³Όλ₯Ό 보면, μ»΄νμΌλ¬κ° λλ€μμ νμ μ μ΄λ€ νμμΌλ‘ λ§λ€μ΄ λ΄λμ§ μ μ μλ€.
μΈλΆν΄λμ€$λ²νΈ
import com.sun.org.apache.xerces.internal.dom.PSVIAttrNSImpl;
@FunctionalInterface
interface MyFunction {
void myMethod();
}
class Outer {
int val = 10; // Outer.this.val
class Inner {
int val = 20; // this.val
void method(int i) { // void method(final int i) { μ λμΌ
int val = 30; // final int val = 30;
// i = 10; // μλ¬. μμμ κ°μ λ³κ²½ν μ μμ.
MyFunction f = () -> {
System.out.println(" i : " + i); // 100
System.out.println(" val : " + val); // 30
System.out.println(" this.val : " + ++this.val); // 21
System.out.println(" Outer.this.val : " + ++Outer.this.val); // 11
};
f.myMethod();
}
} // Innerν΄λμ€ λ
} // Outer ν΄λμ€ λ
public class LambdaEx3 {
public static void main(String[] args) {
Outer outer = new Outer();
Outer.Inner inner = outer.new Inner();
inner.method(100);
}
}
μμ 14-3) μμλ, λλ€μ λ΄μμ μ°Έμ‘°νλ μ§μλ³μλ finalμ΄ λΆμ§ μμμ΄λ μμλ‘ κ°μ£Όλλ€. λλ€μ λ΄μμ μ§μλ³μ iμ valμ μ°Έμ‘°νκ³ μμΌλ―λ‘ λλ€μ λ΄μμλ λ€λ₯Έ μ΄λ κ³³μμλ κ°μ λ³κ²½νλ μΌμ νμ©λμ§ μλλ€. λ°λ©΄μ Innerν΄λμ€μ Outerν΄λμ€μ μΈμ€ν΄μ€ λ³μμΈ this.valμ Outer.this.valμ μμλ‘ κ°μ£Όλμ§ μμΌλ―λ‘ κ°μ λ³κ²½ν΄λ λλ€.
void method(int i) {
int val = 30; // final int val = 30;
i = 10; // μλ¬1. μμμ κ°μ λ³κ²½ν μ μμ.
MyFunction f = (i) -> { // μλ¬2. μΈλΆ μ§μλ³μμ μ΄λ¦μ΄ μ€λ³΅λ¨.
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);
}
}
λ§€λ² μλ‘μ΄ ν¨μν μΈν°νμ΄μ€λ₯Ό μ μνμ§ λ§κ³ , κ°λ₯νλ©΄ μ΄ ν¨ν€μ§μ μΈν°νμ΄μ€λ₯Ό νμ©νλ κ²μ΄ μ’λ€.
T
λ Type
μ, R
μ Return Type
μ μλ―Ένλ€)ν¨μν μΈν°νμ΄μ€ | λ©μλ | μ€λͺ |
---|---|---|
java.lang.Runnable | void run() |
맀κ°λ³μλ μκ³ , λ°νκ°λ μμ |
Supplier<T> |
void accept(T t) βTβ> |
맀κ°λ³μλ μκ³ , λ°νκ°λ§ μμ |
Consumer<T> |
βTβ> void accept(T t) |
Supplierμ λ°λλ‘ λ§€κ°λ³μλ§ μκ³ , λ°νκ°μ΄ μμ |
Function<T,R> |
βTβ> R apply(T t) βRβ> |
μΌλ°μ μΈ ν¨μ, νλμ 맀κ°λ³μλ₯Ό λ°μμ κ²°κ³Όλ₯Ό λ°ν |
Predicate<T> |
βTβ> boolean test(T t) βbooleanβ> |
쑰건μμ νννλλ° μ¬μ©λ¨. 맀κ°λ³μλ νλ, λ°ν νμ μ boolean |
Predicateλ Functionμ λ³νμΌλ‘, λ°ννμ μ΄ booleanμ΄λΌλ κ²λ§ λ€λ₯΄λ€. Predicateλ 쑰건μμ λλ€μμ νννλλ° μ¬μ©λλ€.
Predicate<String> isEmptyStr = s -> s.length() == 0;
String s = "";
if (isEmptyStr.test(s)) // if(s.length()) == 0
System.out.println("This is an empty String.");
맀κ°λ³μμ κ°μκ° 2κ°μΈ ν¨μν μΈν°νμ΄μ€λ μ΄λ¦ μμ μ λμ¬ βBiβκ° λΆλλ€.
T
λ₯Ό μ¬μ©νλ―λ‘, μνλ²³μμ T
λ€μ λ¬ΈμμΈ U
, V
, W
λ₯Ό 맀κ°λ³μμ νμ
μΌλ‘ μ¬μ©νλ κ²μΌ λΏ λ³λ€λ₯Έ μλ―Έλ μλ€.ν¨μν μΈν°νμ΄μ€ | λ©μλ | μ€λͺ |
---|---|---|
BiConsumer<T,U> |
βT, Uβ> void accept(T t, U u) |
λ κ°μ 맀κ°λ³μλ§ μκ³ , λ°νκ°μ΄ μμ |
BiPredicate<T,U> |
βT, Uβ> boolean test(T t, U u) βbooleanβ> |
쑰건μμ νννλλ° μ¬μ©λ¨. 맀κ°λ³μλ λ, λ°νκ°μ boolean |
BiFunction<T,U,R> |
βT, Uβ> βR apply(T t, U u)β βRβ> | λ κ°μ 맀κ°λ³μλ₯Ό λ°μμ νλμ κ²°κ³Όλ₯Ό λ°ν |
@FunctionalInterface
interface TriFunction<T, U, V, R> {
R apply(T t, U u, V v);
}
ν¨μν μΈν°νμ΄μ€ | λ©μλ | μ€λͺ |
---|---|---|
UnaryOperator<T> |
βTβ> `T apply(T t) βTβ> | Functionμ μμ, Functionκ³Ό λ¬λ¦¬ 맀κ°λ³μμ κ²°κ³Όμ νμ μ΄ κ°λ€. | |
BinaryOperator<T> |
βT, Tβ> T apply(T t, T t) βtβ> |
BiFunctionμ μμ, BiFunctionκ³Ό λ¬λ¦¬ 맀κ°λ³μμ κ²°κ³Όμ νμ μ΄ κ°λ€. |
컬λ μ νλ μμμ μΈν°νμ΄μ€μ λ€μμ λν΄νΈ λ©μλκ° μΆκ°λμλλ°, κ·Έ μ€μ μΌλΆλ ν¨μν μΈν°νμ΄μ€λ₯Ό μ¬μ©νλ€. λ€μμ κ·Έ λ©μλλ€μ λͺ©λ‘μ΄λ€.(컬λ μ νλ μμμ ν¨μν μΈν°νμ΄μ€λ₯Ό μ¬μ©νλ λ©μλλ€)
μΈν°νμ΄μ€ | λ©μλ | μ€λͺ |
---|---|---|
Collection | boolean removeIf(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) |
μ§μ λ ν€μ κ°μ μμ fλ₯Ό μν |
Map | V computeIfAbsent(K key, Function<K, V> f) |
ν€κ° μμΌλ©΄, μμ f μν ν μΆκ° |
Map | V computeIfPresent(K key, BiFunction<K, V, V> f) |
μ§μ λ ν€κ° μμ λ, μμ f μν |
Map | V merge(K key, V value, BiFunction<V, V, V> f) |
λͺ¨λ μμμ λ³ν©μμ fλ₯Ό μν |
Map | void forEach(BiConsumer<K, V> action) |
λͺ¨λ μμμ μμ actionμ μν |
Map | void replaceAll(BiFunction<K, V, V> f) |
λͺ¨λ μμμ μΉνμμ fλ₯Ό μν |
public class LambdaEx4 {
public static void main(String[] args) {
ArrayList<Integer> list = new ArrayList<>();
for (int i = 0 ; i < 10 ; i++) {
list.add(i);
}
// list λͺ¨λ μμ μΆλ ₯
list.forEach(i -> System.out.print(i + ",")); // 0,1,2,3,4,5,6,7,8,9,
System.out.println();
// listμμ 2 λλ 3μ λ°°μλ₯Ό μ κ±°νλ€.
list.removeIf(x -> x % 2==0 || x % 3 ==0); // [1, 5, 7]
System.out.println(list);
list.replaceAll(i -> i * 10); // listμ κ° μμμ 10μ κ³±νλ€.
System.out.println(list); // [10, 50, 70]
Map<String, Object> map = new HashMap<>();
map.put("1", "1");
map.put("2", "2");
map.put("3", "3");
map.put("4", "4");
// mapμ λͺ¨λ μμλ₯Ό {k, v} μ νμμΌλ‘ μΆλ ₯νλ€.
map.forEach((k, v) -> System.out.print("{" + k + " ," + v + "},")); // {1 ,1},{2 ,2},{3 ,3},{4 ,4},
System.out.println();
}
}
import com.sun.scenario.effect.impl.sw.sse.SSEBlend_SRC_OUTPeer;
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) {
Supplier<Integer> s = () -> (int)(Math.random() * 100) + 1;
Consumer<Integer> c = i -> System.out.print(i + ", ");
Predicate<Integer> p = i -> i%2 == 0;
Function<Integer, Integer> f = i -> i/10*10; // iμ 1μ μ리λ₯Ό μμ€λ€.
List<Integer> list = new ArrayList<>();
makeRandomList(s, list);
System.out.println(list); // λλ€μ«μ λ½μ [79, 78, 84, 9, 39, 4, 15, 21, 99, 13]
printEvenNum(p, c, list); // λ½μ κ² μ€μμ μ§μλ§ μΆλ ₯ [78, 84, 4, ]
List<Integer> newList = doSomething(f, list);
System.out.println(newList); // λλ€μ«μλ€ μ€ 1μ μ리 μμ°[70, 70, 80, 0, 30, 0, 10, 20, 90, 10]
}
static <T> List<T> doSomething(Function<T, T> f, List<T> list) {
List<T> newList = new ArrayList<T>(list.size());
for (T i : list) {
newList.add(f.apply(i));
}
return newList;
}
static <T> void printEvenNum(Predicate<T> p, Consumer<T> c, List<T> list) {
System.out.print("[");
for (T i : list) {
if (p.test(i))
c.accept(i);
}
System.out.println("]");
}
static <T> void makeRandomList(Supplier<T> s, List<T> list) {
for (int i = 0 ; i < 10 ; i++) {
list.add(s.get());
}
}
}
μΈν°νμ΄μ€ | λ©μλ | μ€λͺ |
---|---|---|
Double TolIntFunction | βdoubleβ> int applyAsInt(double d) βintβ> |
A ToB Functionμ μ
λ ₯μ΄ Aνμ
μΆλ ₯μ΄ Bνμ
|
ToIntFunction<T> |
βTβ> int applyAsInt(T value) βintβ> |
ToB Functionμ μΆλ ₯μ΄ Bνμ
μ΄λ€. μ
λ ₯μ μ§λ€λ¦ νμ
|
IntFunction<T> |
βintβ> R apply(T t, U u) βRβ> |
A Functionμ μ
λ ₯μ΄ Aνμ
μ΄κ³ μΆλ ₯μ μ§λ€λ¦ νμ
|
ObjIntConsumer<T> |
βT, intβ> void accept(T t, U u) |
ObjA Functionμ μ
λ ₯μ΄ T, Aνμ
μ΄κ³ μΆλ ₯μ μλ€. |
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; // iμ μΌμ μ리λ₯Ό μμ€λ€.
int[] arr = new int[10];
makeRandomList(s, arr);
System.out.println(Arrays.toString(arr)); // [27, 29, 54, 82, 71, 91, 62, 63, 51, 8]
printEvenNum(p, c, arr); // [54, 82, 62, 8, ]
int[] newArr = doSomething(op, arr);
System.out.println(Arrays.toString(newArr)); // [20, 20, 50, 80, 70, 90, 60, 60, 50, 0]
}
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);
}
System.out.println("]");
}
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;
}
}
Function f = (a) -> 2*a; // μλ¬. aμ νμ
μ μ μ μμΌλ―λ‘ μ°μ°λΆκ°
// OK, 맀κ°λ³μ νμ΄λ΄ λ°ννμ
μ΄ Integer
Function<Integer, Integer> f = (a) -> 2*a;
// OK, 맀κ°λ³μ νμ
μ int, λ°ννμ
μ Integer
IntFunction<Integer> f = (a) -> 2 * a;
<T>
λΌκ³ μΈ μ μλ€. Function<T, T>
λΌκ³ μ¨μΌ νλ€.Function
<V>
Function<T, V> andThen
(Function<? super R, ? extends V> after)<V>
Function<V, R> compose
(Function<? super V, ? extends T> before)<T>
Function<T, T> identify
()Predicate
<T>
and
(Predicate<? super T> other)<T>
or
(Predicate<? super T> other)<T>
negate()
<T>
Predicate<T>
isEqual(Object targetRef)(μλ°μ μ μ p809 κ·Έλ¦Ό14-1μ μμΈν λμμμ)
<V>
Function<T, V> andThen(Function<? super R, ? extends V> after)<V>
Function<V, R> compose(Function<? super V, ? extends T> before)μλ₯Ό λ€μ΄, λ¬Έμμ΄μ μ«μλ‘ λ³ννλ ν¨μ fμ μ«μλ₯Ό 2μ§ λ¬΄μμ΄λ‘ λ³ννλ ν¨μ gλ₯Ό andThen()μΌλ‘ ν©μ±νμ¬ μλ‘μ΄ ν¨μ hλ₯Ό λ§λ€μ΄λΌ μ μλ€.
String
, Integer> f = (s) -> Integer.parseInt(s, 16);String
> g = (i) -> Integer.toBinaryString(i);String
, String
> h = f.andThen(g);ν¨μ hμ μ§λ€λ¦ νμ
μ΄ <String, String>
μ΄λ€. μ¦, Stringμ μ
λ ₯λ°μμ Stringμ κ²°κ³Όλ‘ λ°ννλ€. μλ₯Ό λ€μ΄ ν¨μ hμ λ¬Έμμ΄ βFFβλ₯Ό μ
λ ₯νλ©΄, κ²°κ³Όλ‘ β11111111βμ μ»λλ€.
μ΄λ²μ compose()λ₯Ό μ΄μ©ν΄μ λ ν¨μλ₯Ό λ°λμ μμλ‘ ν©μ±ν΄λ³΄μ.
μ΄μ κ³Ό λ¬λ¦¬ ν¨μ hμ μ§λ€λ¦ νμ
μ΄ <Integer, Integer>
μ΄λ€. ν¨μ hμ μ«μ 2λ₯Ό μ
λ ₯νλ©΄, κ²°κ³Όλ‘ 16μ μ»λλ€.
κ·Έλ¦¬κ³ identify()λ ν¨μλ₯Ό μ μ©νκΈ° μ΄μ κ³Ό μ΄νκ° λμΌν βνλ± ν¨μβκ° νμν λ μ¬μ©νλ€. μ΄ ν¨μλ₯Ό λλ€μμΌλ‘ νννλ©΄ βx -> xβ μ΄λ€. μλμ λ λ¬Έμ₯μ λλ±νλ€.
μ°Έκ³ ) νλ± ν¨μλ ν¨μμ xλ₯Ό λμ νλ©΄ κ²°κ³Όκ° xμΈ ν¨μλ₯Ό λ§νλ€. f(x) = x
Function<String, String> f = x -> x; // Function<String, String> f = Function.identify(); // μμ λ¬Έμ₯κ³Ό λμΌ System.out.println(f.apply(βAAAβ)); // AAAκ° κ·Έλλ‘ μΆλ ₯λ¨
Predicate<Integer> p = i -> i < 100;
Predicate<Integer> q = i -> i < 200;
Predicate<Integer> r = i -> i % 2 == 0;
Predicate<Integer> notP = p.negate(); // i >= 100
// 100 <= i && (i < 200 || i%2 ==0)
Predicate<Integer> all = notP.and(q.or(t));
System.out.println(all.test(150)); // true
Predicate<Integer> all = notP.and(i -> i < 200).or(i -> i % 2 == 0);
Predciate<String> p = Predicate.isEqual(str1);
boolean result = p.test(str2); // str1κ³Ό str2κ³Ό κ°μμ§ λΉκ΅νμ¬ κ²°κ³Όλ₯Ό λ°ν
// str1κ³Ό str2κ° κ°μμ§ λΉκ΅
boolean result = Predicate.isEqual(str1).test(str2);
import java.util.function.Function;
import java.util.function.Predicate;
public class LambdaEx7 {
public static void main(String[] args) {
Function<String, Integer> f = (s) -> Integer.parseInt(s, 16);
Function<Integer, String> g = (i) -> Integer.toBinaryString(i);
Function<String, String> h = f.andThen(g);
Function<Integer, Integer> h2 = f.compose(g);
System.out.println(h.apply("FF")); // "FF" -> 255 -> "11111111"
System.out.println(h2.apply(2)); // 2 -> "10" -> 16
Function<String, String> f2 = x -> x; // νλ±ν¨μ(identity function)
System.out.println(f2.apply("AAA")); // AAAκ° κ·Έλλ‘ μΆλ ₯λ¨
Predicate<Integer> p = i -> i < 100;
Predicate<Integer> q = i -> i < 200;
Predicate<Integer> r = i -> i % 2 == 0;
Predicate<Integer> notP = p.negate(); // i >= 100
Predicate<Integer> all = notP.and(q.or(r));
System.out.println(all.test(150)); // true
String str1 = "abc";
String str2 = "abc";
// str1κ³Ό str2κ° κ°μμ§ λΉκ΅ν κ²°κ³Όλ₯Ό λ°ν
Predicate<String> p2 = Predicate.isEqual(str1);
boolean result = p2.test(str2);
System.out.println(result); // true
}
}
λ©μλ μ°Έμ‘°(method reference)
λΌλ λ°©λ²μΌλ‘ λλ€μμ κ°λ΅ν ν μ μλ€. μλ₯Ό λ€μ΄ λ¬Έμμ΄μ μ μλ‘ λ³ννλ λλ€μμ μλμ κ°μ΄ μμ±ν μ μλ€.Function<String, Integer> f = (String s) -> Integer.parseInt(s);
보ν΅μ μμ²λΌ λλ€μμ μμ±νλλ°, μ΄ λλ€μμ λ©μλλ‘ νννλ©΄ μλμ κ°λ€.
μ°Έκ³ ) λλ€μμ μλ°ν λ§νμλ©΄ μ΅λͺ ν΄λμ€μ κ°μ²΄μ§λ§ κ°λ¨ν λ©μλλ§ μ μλ€.
Integer wrapper(String s) { // μ΄ λ©μλμ μ΄λ¦μ μλ―Έμλ€.
return Integer.parseInt(s);
}
μμ wrapper λ©μλλ λ³λ‘ νλ μΌμ΄ μλ€.κ·Έμ κ°μ λ°μμ Integer.parseInt()μκ² λ겨주λ μΌλ§ ν λΏμ΄λ€. μ°¨λΌλ¦¬ μ΄ κ±°μΆμ₯μ€λ¬μ΄ λ©μλλ₯Ό λ²κ²¨λ΄κ³ Integer.parseInt()λ₯Ό μ§μ νΈμΆνλ κ²μ΄ λ λ«μ§ μμκΉ?
Function<String, Integer> f = (String s) -> Integer.parseInt(s);
Function<String, Integer> f = Integer::parseInt; // λ©μλ μ°Έμ‘°
BiFunction<String, String, Boolean> f = (s1, s2) -> s1.equals(s2);
μ°Έμ‘°λ³μ fμ νμ λ§ λ΄λ λλ€μμ΄ λ κ°μ Stringνμ μ 맀κ°λ³μλ₯Ό λ°λλ€λ κ²μ μ μ μμΌλ―λ‘, λλ€μμ 맀κ°λ³μλ€μ μμ΄λ λλ€. μμ λλ€μμμ 맀κ°λ³μλ€μ μ κ±°ν΄μ λ©μλ μ°Έμ‘°λ‘ λ³κ²½νλ©΄ μλμ κ°λ€.
BiFunction<String, String, Boolean> f = (s1, s2) -> s1.equals(s2);
BiFunction<String, String, Boolean> f = String::equals; // λ©μλ μ°Έμ‘°
MyClass obj = new MyClass();
Function<String, Boolean> f = (x) -> obj.equals(x); // λλ€μ
Function<String, Boolean> f2 = obj::equals; // λ©μλ μ°Έμ‘°
μ’ λ₯ | λλ€ | λ©μλ μ°Έμ‘° |
---|---|---|
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; // λ©μλ μ°Έμ‘°
BiFunction<Integer, String, MyClass> bf = (i, s) -> new MyClass(i, s);
BiFunction<Integer, String, Myclass> bf2 = MyClass::new; // λ©μλ μ°Έμ‘°
Function<Integer, int[]> f = x -> new int[x]; // λλ€μ
Function<Integer, int[]> f2 = int[]::new; // λ©μλ μ°Έμ‘°