심심해서 짜봤엉 쳐머겅
이건 legacy style로 짜는게 더 나은게 아니라
느그들이 functional programming을 존나 못해서 짜낸 코드 수준이 그따위인거야 :-)
내가 남들 C++ 할 시간에 Java 해서 그수준이면 솔직히 어디가서 쪽팔릴까봐 질문은 못받을 것 같아 ㅎㅎ
열공행
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
|
import org.jetbrains.annotations.NotNull;
import java.util.HashMap;
import java.util.Map;
import java.util.Optional;
import java.util.function.Function;
public class A {
public static void main(String[] args) {
String nickname = "FUCK_YOU";
Map profile = new HashMap();
profile.put("nickname", nickname);
Map kakaoAccount = new HashMap();
kakaoAccount.put("profile", profile);
Map map = new HashMap();
map.put("kakao_account", kakaoAccount);
Object object = map;
Optional<String> a = Optional.ofNullable(object)
.flatMap(A::tryCastToMap)
.map(mapGetter("kakao_account"))
.flatMap(A::tryCastToMap)
.map(mapGetter("profile"))
.flatMap(A::tryCastToMap)
.map(mapGetter("nickname"))
.flatMap(A::tryCastToString);
System.out.println(a.get());
}
@NotNull
private static Function<? super Map, ?> mapGetter(@NotNull Object key) {
return map -> map.get(key);
}
@NotNull
private static Optional<String> tryCastToString(@NotNull Object object) {
return tryCast(object, String.class);
}
@NotNull
private static Optional<Map> tryCastToMap(@NotNull Object object) {
return tryCast(object, Map.class);
}
@NotNull
private static <T> Optional<T> tryCast(@NotNull Object object, @NotNull Class<T> clazz) {
if (clazz.isInstance(object)) return Optional.of((T) object);
else return Optional.empty();
}
}
|
|
29개의 댓글
무분별한 사용은 차단될 수 있습니다.
앙호호앙잉
??
왈도식개발
https://www.dogdrip.net/index.php?mid=computer&category=180739712&document_srl=282396930&page=1
요런 친구가 있길래 야밤에 심심해서 그만 ㅎㅎ
德板王
컴공 사람들 참 피곤하게 사네
미제승냥이
코틀린놔두고 굳이 자바로 이렇게 비트는이유는 뭐임? 언어 자체가 함수를 퍼스트클래스로 안다루는데 뭐하러 자바로 함수지향 구현하겠다고 어거지로 하는거야?
왈도식개발
평소에 코틀린으로 짜 ㅇㅇ
저 코드를 올린 친구가 자바로 짰길래 ㅇㅇ
미제승냥이
+내가 본 금융권중에 jdk 1.4쓰는경우도 있었는데 그런것들 어떻게 커버하려고?
왈도식개발
1.4는 그냥 traditional하게 짜야지뭐
1.7에서 못올리는 상황이면 코틀린이 답이 될거고
1.8 이상이면 traditional하게 짤 이유가 없음
미제승냥이
속도.. 메소드핸들이랑 instanceof가 생각보다 비용이 큼
근데 뭐 굳이 자바로 억지로 비튼이유가 있다고 하니까 더 얘기는 안함
왈도식개발
억지로 비틀었다기보단 ㅋㅋㅋㅋㅋ 원글이 java 1.8을 전제로 하니까 개선 코드도 같은 환경으로 짠거지뭐
왈도식개발
(object as? Map)?.get("kakao_account")
?.let { it as? Map }?.get("profile")
?.let { it as? Map }?.get("nickname") as? String
대강 이런식이 나오겠지? IDE에서 짠게 아니라 제대로 안돌아갈 수 있음
미제승냥이
ㅇㅇㅇㅇ 내가한얘기가 이거였어
왜 둘다 굳이 자바에서 저러는지가 궁금했던거임ㅋㅋ
왈도식개발
이런 경우에선 상대방 환경에 맞춰서 제시하는게 맞으니까 ㅋㅋㅋㅋ
왈도식개발
그리고 원글 코드에서 Optional을 썼는데 java Optional이 생긴건 1.8 이후부터임 ㅇㅇ
그래서 개선 코드도 1.8 이상을 전제로 작성했음
미제승냥이
방금 원글 보고왔는데 결국 캐스팅만 걍 함수로 뺀거아님?
왈도식개발
원글 코드가 드러운것도 filter에서 type matching하고 map에서 type casting & populate를 하기 때문인데, 핵심을 못찌르고 optional chaining의 단점이라 주장하는게 잘못된걸 보여주고 싶어서 ㅇㅇ
원글 주장 : Optional chaining이 비효율적이어서 traditional method로 접근하는게 더 나을 때가 있음
내 주장 : Optional chaining이 비효율적으로 보여지는건 니가 못짜서임
미제승냥이
근데 걍
try{
return obj.get("kakao_account").get("profile").getString("nickname");
}catch(){return null;}
이거놔두고 굳이 뭐하러 저렇게해?
왈도식개발
성능을 논하면서 exception 생성되는 데서 생기는 성능 저하는 생각하지 않으시는군요
미제승냥이
ㄴㄴ익셉션 jvm쪽에서 보면 생각보다 성능저하 없어
왜냐면 jvm에서 인스트럭션 실행할때 java/lang으로 시작하는 시스템클래스는 거기서 익셉션테이블로 바로 점프 가능하게 구현돼있음
왈도식개발
저 경우에 NPE가 뜨면 stacktrace filling에서 성능 저하가 있을텐데?
미제승냥이
콜스택은 언제나 항상 차있어
jvm쪽보면
if(exceptionOccured()) {
goto catch;
}
매 옵코드마다 이런거 반복함
익셉션 코스트는 branch보다 약간 더 높은수준이야
그에비해서 메소드핸들은 .class의 어트리뷰트테이블 조회해서 거기로 가는과정이 필요하고 바로 invoke 못시킴..
왈도식개발
오우 하나 배웠다 내 지식이 너무 옛것이었네
JVM exception 성능이 많이 올라갔네 게다가 JIT 타면 거의 C++ 스러운 구조로 가는 것 같구마잉
stacktrace filling에서 성능 저하를 얘기한건 memcpy 얘기한건데 하긴 사실 요즘 memcpy보단 method handle이 더느리겠다
왈도식개발
방금 다시 IDEA에 떄려박고 바이트코드 봤는데
invokedynamic에서 Bootstrap Method Table inquiry가 발생하는거 생각해보니까 선생님 말씀이 아주 정확하십니다 ㄱㅅㄱㅅ
미제승냥이
요점은 니가 코틀린코드로 올린
(object as? Map)?.get("kakao_account")
?.let { it as? Map }?.get("profile")
?.let { it as? Map }?.get("nickname") as? String
이거처럼 자바에는 자바스러운방법이 있는데 왜 자바에서 자꾸 코틀린같은거 따라가려고하는지가 궁금했던거임
가독성이 올라가는것도 아니고 빠른것도 아니고 애초에 메소드를 퍼스트클래스로 다루질 않아서 진짜 함수지향이 불가능한언어인데 왜 굳이 자바에서 그러는지
근데 뭐 환경에맞춰서 구현해준거라하니까 그러려니함
왈도식개발
Java8에서 function as first class가 안되어도 functional programming이 아에 불가능한건 아니지
Optional chaining은 결국 코드를 monadic하게 짜겠다는거고 monad를 다룸에 있어서 functional하게 짜지 않으니까 코드가 더 길어지고 필요 이상의 캐스팅이 필요해지는걸 지적하는거임
왈도식개발
즉 optional chaining을 제대로 쓰고 나서 traditional way를 better option으로 제시하면 모르겠는데
Optional chaining을 제대로 못써놓고 traditional way를 얘기하면서 으스대시는게 넘나 멋져보여서 그런거임 ㅎㅎ
왈도식개발
성능을 생각하지 않더라도
일단 (String) ((Map) ((Map) (Map obj).get("kakao_account")).get("profile")).get("nickname") 식으로 캐스팅 해줘야될거고
그래도 되도록 중간 단계가 보이게 짜주는게 좋음 ㅇㅇ 너무 암묵적으로만 짜면 보는 사람 입장에서 추론하는데 코스트가 늘어나니까
사사사샥
뭔소린지는 모르겠지만
일단 스샷 찍어갑니다
잠적자
킹갓 js,ts로 정신건강을 챙기자
const nickname = object?.profile?.nickname
왈도식개발
미리 타입이 잡혀있음 코틀린도 똑같이 가능 ㅇㅇ