Java 8에서 새롭게 사용 가능한 API로 Stream, lambda, Optional 이 있습니다.
그중 Stream 을 사용해보았던 기록을 남겨 봅니다.
Stream을 사용하다보면 Python을 처음 사용했을때처럼, 코드를 줄이고 간단하게 만들어나가는 재미가 있습니다.
함수형 프로그래밍이니, 성능이니(Stream API는 for-loop 보다 성능이 안좋다고 한다)를 떠나서 코드를 만드는 재미가 있기때문에 계속 사용해보고 싶은 생각이 들었습니다.
어느 시스템을 운영할때 2차원 배열로 된 String array 를 다룬다고 가정해보겠습니다.
1 |
String[][] array = {{"ABC,DFB,35"} ,{"DBS,ACR"} ,{"DR3,DF"}}; |
2차원 배열의 각 value는 “,”를 delimiter 로 가지는 값입니다.
위의 array 에서 for-loop로 “DFB” 가 존재하는지 확인하려면 아래와 같은 코드로 처리 가능합니다.
1 2 3 4 5 6 7 8 9 10 |
boolean exist = false; if(null != array){ for(int inx = 0; inx < array.length ; inx++){ for(inj = 0 ; inj < array[inx].split(",").length ; inj++){ if("DFB".equals(array[inx].split(",")[inj]){ exist = true; } } } } |
foreach 문도 가능하겠지만, 기존의 for loop로 구현할 경우 index 변수와 2중 loop와 array 가 null 이 아닌지 NPE 예방까지 해야겠죠.
Stream API 로 한번 구현해보겠습니다.
1 2 3 4 5 |
boolean exist = Arrays.stream(Optional.ofNullable(array).orElse(new String[0][])) .flatMap(Arrays::stream) .anyMatch(s -> Pattern.compile(",") .splitAsStream(s) .anyMatch(a->code.equals(a))); |
아직 Stream 을 잘 다루지 못해서 좀 더 복잡할지도 모르겠습니다.
그래도 Python 을 처음 봤을때처럼 코드를 줄이는 재미가 있고, 가독성(?) 이 좋은 부분도 있으며 특히 index 변수를 잘못 사용해서 발생하는 miss를 줄일 수 있겠네요.
람다나 Stream 을 더 잘 활용할 수 있다면 Java 코드는 간결해지고 가독성이 높아질것 같습니다.
Parallel Stream 처럼 쓰레드를 이용한 병렬처리도 가능하니 for문안에서 여러 연산이 필요한 경우 Stream을 잘 이용한다면 성능적인 이점도 가질 수 있지 않을까요.
참고 : https://futurecreator.github.io/2018/08/26/java-8-streams/