가자미의 개발이야기
자바 메소드 참조 본문
-메소드 참조는 특수한 상황일 때, 람다식을 좀 더 줄일 수 있는 표현이다.
-일종의 약속이니 예제에서 약속을 파악하자.
-static 메소드 참조
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
import java.util.Arrays;
import java.util.List;
import java.util.ArrayList;
import java.util.Collections;
interface Consumer<T>{
void accept(T t);
}
public class ArrangeList {
public static void main(String[] args) {
List<Integer> ls = Arrays.asList(1, 3, 5, 7, 9);
ls = new ArrayList<>(ls);
//Collection 클래스의 public static void reverse 메소드를 전달.
Consumer<List<Integer>> c = Collections::reverse;//메소드 참조식 표현.
//Consumer<List<Integer>> c = l->Collections.reverse(l);//람다식 표현.
//accept메소드 호출 때 전달되는 인자를 reverse메소드에 그대로 전달.
c.accept(ls);
System.out.println(ls);
}
}
|
cs |
-인스턴스 메소드 참조
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|
import java.util.Arrays;
import java.util.List;
import java.util.ArrayList;
import java.util.Collections;
interface Consumer<T>{
void accept(T t);}
class JustSort{
public void sort(List<?> lst) {
Collections.reverse(lst);
}
}
public class ArrangeList {
public static void main(String[] args) {
List<Integer> ls = Arrays.asList(1, 3, 5, 7, 9);
ls = new ArrayList<>(ls);
JustSort js = new JustSort(); //js는 effectively final. 실제로 상수는 아니지만, 코드 내에서 변경되지 않는 사실상 상수.
Consumer<List<Integer>> c = js::sort;//메소드 참조식 표현.
//Consumer<List<Integer>> c = e->js.sort(e);//람다식 표현.
//accept메소드 호출 때 전달되는 인자를 메소드에 그대로 전달.
c.accept(ls);
System.out.println(ls);
}
}
|
cs |
-인스턴스 없이 인스턴스 메소드 참조
--첫번째 인자의 인스턴스 메소드에 두번째 인자를 해당 메소드의 인자로 사용할 때만!
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
|
interface ToIntBiFunction<T,U>{
int applyAsInt(T t, U u);
}
class IBox{
private int n;
public IBox(int i) {n=i;}
public int larger(IBox b) {
if (n>b.n)
return n;
else
return b.n;
}
}
public class InstanceMethod {
public static void main(String[] args) {
IBox ib1 = new IBox(5);
IBox ib2 = new IBox(7);
//람다식 표현
//ToIntBiFunction<IBox, IBox> bf = (b1,b2)->b1.larger(b2);
//메소드 참조식 표현
ToIntBiFunction<IBox, IBox> bf = IBox::larger; //약속에 근거
int bignum = bf.applyAsInt(ib1, ib2);
System.out.println(bignum);
}
}
|
cs |
-생상자 참조
1
2
3
4
5
6
7
8
9
10
11
12
13
|
import java.util.function.Function;
public class StringMaker {
public static void main(String[] args) {
//람다식 표현
//Function<char[], String> f = ar->{return new String(ar);};
//생생자 참조식 표현
Function<char[], String> f = String::new;
char[] src = {'R', 'o', 'b', 'o', 't'};
String str = f.apply(src);
System.out.println(str);
}
}
|
cs |
'Java > 자바 기본 문법' 카테고리의 다른 글
자바 스트림의 기초 (0) | 2021.02.09 |
---|---|
자바 Optional 클래스 (0) | 2021.02.09 |
자바 람다 정의되어 있는 함수형 인터페이스 (0) | 2021.02.04 |
자바 람다의 어노테이션과 제네릭 (0) | 2021.02.04 |
자바 다양한 람다식 (0) | 2021.02.04 |