๐ ์๋ฐ์ ์ ์์ ์ ๋ฆฌํ ๋ด์ฉ์ ๋๋ค.

โช ๋๋ค์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 |