1급 함수라고도 하며 보통 자바스크립트를 배울때 많이 나오는 내용이나, 자바에서는 함수형 인터페이스를 통해 구현 이 가능합니다.
# Ex01
function add(a,b)
return a+b;
# Ex 02
function add(a,b)
return a+b+this.c
static Function<Integer, Set<Integer>> factors = (number) -> {
HashSet<Integer> factors = new HashSet<>(); // 기존 HashSet 을 받는것 보다, 다른걸 사용
IntStream range = IntStream.rangeClosed(1, (int) Math.sqrt(number));
range.forEach(ele -> {if(isFactor.apply(number, ele)){factors.add(ele); factors.add(number / ele);}});
return factors;
};
// 만약에 받아와야 되는 상황이라면 ?
static BiFunction<Integer, Set<Integer>, Set<Integer>> factors = (number, originalSet) -> {
HashSet<Integer> factors = Set.copyOf(originalSet); // 기존 HashSet 을 받아서 복사하여 사용
IntStream range = IntStream.rangeClosed(1, (int) Math.sqrt(number));
range.forEach(ele -> {if(isFactor.apply(number, ele)){factors.add(ele); factors.add(number / ele);}});
return factors;
};
static public boolean isDeficient(Function<Integer, Set<Integer>> factors, int number) {
return sum(factors.apply(number)) - number < number;
}
심볼의 값이 변경되지 않는가? 일단 받아온 객체들은 전부 가변적으로 복사되기 때문에 외부 참조로 인해서 값이 변경될 수 없음. 외부에서 로직도중에 original Set 을 바꾸더라도 의미가 없음. 해당 로직진행은 originalSet 을 복사한 copySet 인 factors 로 진행이 되므로(다른 객체이므로 JVM에서 다른 힙영역을 가지기 때문에)
static BiFunction<Integer, Set<Integer>, Set<Integer>> factors = (number, originalSet) -> {
HashSet<Integer> factors = Set.copyOf(originalSet); // 기존 HashSet 을 받아서 복사하여 사용
IntStream range = IntStream.rangeClosed(1, (int) Math.sqrt(number));
range.forEach(ele -> {if(isFactor.apply(number, ele)){factors.add(ele); factors.add(number / ele);}});
return factors;
};
function a(){
let x = 10;
var innerFunc = fuction() {console.log(x);}
}
function b(x){
console.log(1 + x);
}
a() // 10
function a(){
let x = 10;
var innerFunc = fuction() {console.log(x);}
return innerFunc;
}
function b(x){
console.log(1 + x);
}
var inner = b();
inner(); // 10
@Pyro(고정완) 에게 남긴 답변
계속 어떻게 구현할 수 있나 찾아보려고 하고 있는데, 제 한계로는 제일 비슷한 구현은 이거네요..
public static void main(String[] args) {
a();
}
public static void a(){
Supplier<Integer> callout = add.apply(10);
Integer integer = callout.get();
System.out.println("after : " + integer);
}
static Function<Integer, Supplier<Integer>> add = (number) -> {
int x = 10;
Supplier<Integer> supplier = () -> {
System.out.println("Before : " + x);
return x;
};
return supplier;
};
결과값은
Before : 10 after : 10입니다.
그런데 출력값만 비슷하지, 만약 클로저처럼 외부 스코프의 값을 바인딩 해온뒤 참조할 수 있는 일이라면
static Function<Integer, Supplier<Integer>> add = (number) -> {
int x = 10;
System.out.println("Inner : " + x);
Supplier<Integer> supplier = () -> {
System.out.println("Before : " + x);
x += 10;
System.out.println();
return x;
};
return supplier;
};
아래의 코드도 작동해야 할텐데, lamdba 는 최종적인형태로 되어야 한다며 되지않습니다. 아마 자바에서 지원하는 람다는 값을 복사하여 유지하는 것 같습니다. 아마 람다가 들여오는 값조차 final 로 인식하여 들여오기에 새로운값을 할당하지 못하는 것이 아닌가? 이런 추측이 드네요. 그래서 오류가 나는것이 아닐까?클로저는 외부 변수를 참조하고, 람다는 매개변수만 참조하는 목적성인것 같은데 혹시 파이로 생각은 어떤가요??
https://dinfree.com/lecture/language/112_java_9.html
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Closures
https://medium.com/@la.place/higher-order-function-이란-무엇인가-1c61e0bea79