-
[Spring Boot] For Loop vs Stream, FindById vs GetOneBackend/개발 2021. 7. 12. 01:08반응형
개인 프로젝트 중에 mvpscore저장방식 고민
1. For loop vs stream
// mvpscore //걸린 시간 : 0.00455935 milli seconds List<Map.Entry<Long,Double>> entries = statisticsService.getMvpScore(participants, winTotalKills, loseTotalKills, winTotalGoldEarned, loseTotalGoldEarned); for (GameRecordDto gameRecordDto : result) { gameRecordDto.getParticipants().forEach( parti->{ long mvp=0l; for( Map.Entry<Long,Double> entry : entries){ if(entry.getKey().equals(parti.getAccountId())){ mvp = entry.getValue().longValue(); break; } } parti.getStats().setMvpScore(mvp); } ); }
statisticsService.getMvpScore 에서
map에 id : mvpscore 저장하고 mvpscore 정렬해서 1~10 순위 매겨줘야해서 List로 감쌌다.
gameRecordDto > participants > stats 에 mvpscore에 저장해줘야하는데
list에 있는 10개 값중에 participants id와 맞는 값을 가져올때 뭔가 효율적으로 해보고싶은데 어떻게해야될지 고민이다
일단 그냥 완탐으로 for문을 돌려서 했는데 , 그게 맞나 싶기도하고 안예뻐보여서
// mvpscore // 걸린 시간 : 0.004336385 milli seconds List<Map.Entry<Long,Double>> entries = statisticsService.getMvpScore(participants, winTotalKills, loseTotalKills, winTotalGoldEarned, loseTotalGoldEarned); for (GameRecordDto gameRecordDto : result) { gameRecordDto.getParticipants().forEach( participant->{ long mvp = entries.stream() .filter(mvpScoreOfAccountId -> mvpScoreOfAccountId.getKey().equals(participant.getAccountId())) .findAny() .get().getValue().longValue(); participant.getStats().setMvpScore(mvp); } ); }
stream filter를 이용해봤다. 코드 가독성??자체가 더 좋아질까 싶어서 ..
근데 어짜피 하나만 가져올건데 findAny 써야되는지 안써도되는지도 잘 모르겠음..ㅎ
findAny랑 findFirst는 1개만 가져오는건 같은데 병렬적으로 써야되는 상황에서 좀 다르다고함 (?)
근데 for문을 돌리면 break로 나올수라도 있는데 stream은 뭔가 다 탐색하고있어서 오히려 별로인거같기도했다.
for-loop 를 Stream.forEach() 로 바꾸지 말아야 할 3가지 이유
for-loop를 Stream.forEach()로 바꾸지 말아야 할 3가지 이유 원문 : https://blog.jooq.org/2015/12/08/3-reasons-why-you-shouldnt-replace-your-for-loops-by-stream-foreach/ 간디작살! 소스 코드를 Java8로 바꾸자. 뭐든지 함수를 써
homoefficio.github.io
https://www.popit.kr/java8-stream%EC%9D%80-loop%EA%B0%80-%EC%95%84%EB%8B%88%EB%8B%A4/
Java8 Stream은 loop가 아니다. | Popit
Java8에서는 Lambda와 Stream이라는 새로운 개념을 통해 기존 Java를 이용하는 프로그램 방식과는 완전 다른 형태의 프로그램을 가능하도록 하고 있습니다. 필자도 최근 Presto의 소스 코드를 보면서 이
www.popit.kr
다시 원래 코드로 바꿨고,,
생각해보니까 entries값은 어짜피 이때 쓰이고 말거라서 한번 찾은 값 리스트에서 삭제하면 검색할 양 줄지않을까..싶기도 ..?!?
이런생각으로 한번 entries.remove(entry)해봤는데 오히려 시간 재봤더니 더 늘었다..ㅋㅋ 걍 원래코드로 해야될듯
그리고 맨처음할땐 시간이 4단위나오는데 새로고침하면 1로 줄어든다..! ㅇ_ㅇ
이 코드는 그냥 for loop으로 하는것으로 ...
하여튼 포문을 무지성으로 stream으로 변환해버리면 오히려 성능상 안좋을수도 있다는 점 .. 알아두길 ~!!
2. getOne과 findbyid 차이점
2021-07-12 01:38:49.798 INFO 84259 --- [ main] c.m.l.r.GameRecordRepositoryTest : findById Hibernate: select gamerecord0_.game_id as game_id1_2_0_, gamerecord0_.created as created2_2_0_, gamerecord0_.modified as modified3_2_0_, gamerecord0_.game_created as game_cre4_2_0_, gamerecord0_.game_duration as game_dur5_2_0_ from game_records gamerecord0_ where gamerecord0_.game_id=? 2021-07-12 01:38:49.845 INFO 84259 --- [ main] c.m.l.r.GameRecordRepositoryTest : getone
https://granger.tistory.com/50
Spring Data JPA 에서 getOne 과 findById 차이점
Spring Data JPA에서 getOne과 findById의 차이점은 무엇일까? 기본 데이터 저장소에서 개체를 검색하는 데 findById()및 getOne()메서드가 모두 사용된다. 그러나 레코드를 검색하는 기본 메커니즘은이
granger.tistory.com
"A가 B를 필드로 가지고 있는데, B엔티티의 모든 필드가 당장 필요한게 아니라 A엔티티를 반환하기 위해 참조만 필요한 경우에! JPA는 Lazy Evaluation 을 적용해요."
출처: https://yongdev.tistory.com/137 [JDragon]getone - lazy loading
'Backend > 개발' 카테고리의 다른 글
[Spring Boot] spread sheet 연동하기 2 (0) 2021.07.23 [Spring Boot] spread sheet 연동하기 (3) 2021.07.21 [Java] 우선순위 큐, Comparable vs Comparator (2) 2021.07.14 [Notion] TIL 1-27일차 (0) 2021.07.14 [Spring boot] 인턴 프로젝트 기록 - 개발 참고사항 (0) 2020.04.06