Stream을 사용하여 이중포문을 만드는 방법을 알아보겠다.
a리스트에 포함된 값이 b리스트에 있을 시에 c 리스트로 add하는 예제를 사용하였다.
List<String> aNames = List.of("Song", "Belle", "Andrew", "Kevin", "Jia"); List<String> bNames = List.of("Song", "Andrew"); List<String> NamesForLoop = new ArrayList<>(); for(String aName : aNames){ for (String bName : bNames){ if ( bName.equals(aName)){ NamesForLoop.add(bName); } } }
stream의 filter 메소드는 Predicate 함수형 인터페이스를 인자로 받는다.
fitter 내부에 새로운 stream을 생성하여 anyMatch와, Predicate가 기본으로 제공하는 메소드인 isEqual를 사용하여 일치하는 데이터를 필터링 한다.
(isEqual은 null을 인자로 받으면 null을 반환, 그렇지 않으면 boolean타입을 리턴한다.)
이렇게 stream 내부에 stream을 사용하여 이중 for문처럼 구현할 수 있다.
List<String> aNames = List.of("Song", "Belle", "Andrew", "Kevin", "Jia"); List<String> bNames = List.of("Song", "Andrew"); List<String> NamesLambda = aNames .stream() .filter(name -> bNames.stream().anyMatch(Predicate.isEqual(name))) .collect(Collectors.toList());