2016/04/30 - [java] - JAVA 8 Fuctional Inteface, Method reference and Lambda expression #1


이번 글에서는 java.util.function 패키지에 선언된 functional interface 중 primitive type을 다루는 functional interface와 그에 대응하는 람다 표현식 및 메소드 레퍼런스에 대해 알아 보겠습니다. 아래 소스를 보시면 BooleanSupplier, ObjDoubleConsumer, ToLongBiFunction 등을 첫번째 인수로 받는 메소드들을 정의하고 호출하는 로직을 구현하였습니다. Functional interface가 인수로 사용될 때 람다 표현식이 어떻게 전달되는지, 어떤 method reference가 전달되는지 확인해 보세요. 보는데 직관적이지 않다면 답글 주세요~!

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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
package com.jayjaylab.test.testjava.java8;
 
import java.util.ArrayList;
import java.util.List;
import java.util.function.*;
 
/**
 * Created by jjkim on 2016. 5. 5..
 */
public class TestPrimitiveFunction {
    public String addPrefix(double number) {
        return "double number : " + number;
    }
 
    public <T> void addItemToList(List<T> list, double item) {
        //fixme not a good code, use wild card upper bound to restrict generic type.
        list.add((T)String.valueOf(item));
    }
 
    public <T> void addItemToList(List<T> list, int item) {
        list.add((T)String.valueOf(item));
    }
 
    public <T> void addItemToList(List<T> list, long item) {
        list.add((T)String.valueOf(item));
    }
 
    public double sumToDouble(String a, String b) {
        return Double.valueOf(a) + Double.valueOf(b);
    }
 
    public int sumToInt(String a, String b) {
        return Integer.valueOf(a) + Integer.valueOf(b);
    }
 
    public long sumToLong(String a, String b) {
        return Long.valueOf(a) + Long.valueOf(b);
    }
 
    public static void main(String... args) {
        TestPrimitiveFunction function = new TestPrimitiveFunction();
 
        // BooleanSupplier
        System.out.println(function.tryBooleanSupplier(() -> (true)));
        System.out.println(function.tryBooleanSupplier(Thread.currentThread()::isDaemon));
 
        // DoubleBinaryOperator
        System.out.println(function.tryDoubleBinaryOperator(
                (l, r) -> (l + r), 10.0d, 2.0d
        ));
        System.out.println(function.tryDoubleBinaryOperator(
                Double::sum, 10.0d, 2.0d
        ));
 
        // DoubleFunction
        System.out.println(function.<String>tryDoubleFunction(
                (n) -> {return "double number : " + n;}, 10.0d
        ));
        System.out.println(function.<String>tryDoubleFunction(
                function::addPrefix, 10.0d
        ));
 
        // DoubleToIntFunction
        System.out.println(function.tryDoubleToIntFunction(
                (n) -> {return Double.hashCode(n);}, 10.0d
        ));
        System.out.println(function.tryDoubleToIntFunction(
                Double::hashCode, 10.0d
        ));
 
        // ObjDoubleConsumer
        List<String> list = new ArrayList<>(10);
        function.<List<String>>tryObjDoubleConsumer(
                (l, n) -> {l.add(String.valueOf(n));}, list, 10.0d
        );
        function.tryObjDoubleConsumer(
                function::<String>addItemToList, list, 10.0d
        );
 
        // ObjIntConsumer
        function.<List>tryObjIntConsumer(
                (l, n) -> {l.add(String.valueOf(n));}, list, 1
        );
        function.<List>tryObjIntConsumer(
                function::<String>addItemToList, list, 1
        );
 
        // ObjLongConsumer
        function.<List>tryObjLongConsumer(
                (l, n) -> {l.add(String.valueOf(n));}, list, 2L
        );
        function.<List>tryObjLongConsumer(
                function::<String>addItemToList, list, 2L
        );
 
        System.out.println("list : " + list);
 
        // ToDoubleBiFunction
        System.out.println(function.<String, String>tryToDoubleBiFunction(
                (a, b) -> (Double.valueOf(a) + Double.valueOf(b)), "10.0d", "11.0d"
        ));
        System.out.println(function.<String, String>tryToDoubleBiFunction(
                function::sumToDouble, "10.0d", "11.0d"
        ));
 
        // ToDoubleFunction
        System.out.println(function.<String>tryToDoubleFunction(
                (s) -> (Double.valueOf(s)), "10.0d"
        ));
        System.out.println(function.<String>tryToDoubleFunction(
                Double::valueOf, "10.0d"
        ));
 
        // ToIntBiFunction
        System.out.println(function.<String, String>tryToIntBiFunction(
                (a, b) -> (Integer.valueOf(a) + Integer.valueOf(b)), "10", "10"
        ));
        System.out.println(function.<String, String>tryToIntBiFunction(
                function::sumToInt, "10", "10"
        ));
 
        // ToIntFunction
        System.out.println(function.<String>tryToIntFunction(
                (a) -> (Integer.valueOf(a)), "10"
        ));
        System.out.println(function.<String>tryToIntFunction(
                Integer::valueOf, "10"
        ));
 
        // ToLongBiFunction
        System.out.println(function.<String, String>tryToLongBiFunction(
                (a, b) -> (Long.valueOf(a) + Long.valueOf(b)), "10", "20"
        ));
        System.out.println(function.<String, String>tryToLongBiFunction(
                function::sumToLong, "10", "20"
        ));
 
        // ToLongFunction
        System.out.println(function.<String>tryToLongFunction(
                (a) -> (Long.valueOf(a)), "100"
        ));
        System.out.println(function.<String>tryToLongFunction(
                Long::valueOf, "100"
        ));
    }
 
    public boolean tryBooleanSupplier(BooleanSupplier supplier) {
        return supplier.getAsBoolean();
    }
 
    public double tryDoubleBinaryOperator(DoubleBinaryOperator operator,
                                           double left, double right) {
        return operator.applyAsDouble(left, right);
    }
 
    public <R> R tryDoubleFunction(DoubleFunction<R> function, double a) {
        return function.apply(a);
    }
 
    public int tryDoubleToIntFunction(DoubleToIntFunction function, double a) {
        return (int)(a % 100);
    }
 
    public <T> void tryObjDoubleConsumer(ObjDoubleConsumer<T> consumer, T t, double number) {
        consumer.accept(t, number);
    }
 
    public <T> void tryObjIntConsumer(ObjIntConsumer<T> consumer, T t, int number) {
        consumer.accept(t, number);
    }
 
    public <T> void tryObjLongConsumer(ObjLongConsumer<T> consumer, T t, long number) {
        consumer.accept(t, number);
    }
 
    public <T, U> double tryToDoubleBiFunction(ToDoubleBiFunction<T, U> function,
                                             T t, U u) {
        return function.applyAsDouble(t, u);
    }
 
    public <T> double tryToDoubleFunction(ToDoubleFunction<T> function, T t) {
        return function.applyAsDouble(t);
    }
 
    public <T, U> int tryToIntBiFunction(ToIntBiFunction<T, U> function, T t, U u) {
        return function.applyAsInt(t, u);
    }
 
    public <T> int tryToIntFunction(ToIntFunction<T> function, T t) {
        return function.applyAsInt(t);
    }
 
    public <T, U> long tryToLongBiFunction(ToLongBiFunction<T, U> function, T t, U u) {
        return function.applyAsLong(t, u);
    }
 
    public <T> long tryToLongFunction(ToLongFunction<T> function, T t) {
        return function.applyAsLong(t);
    }
}


Posted by 제이제이랩
,