programing tip

인덱스가있는 Java 8 forEach

itbloger 2020. 7. 7. 07:53
반응형

인덱스가있는 Java 8 forEach


forEachJava 8에서 색인으로 반복 되는 메소드 를 빌드하는 방법이 있습니까? 이상적으로는 다음과 같은 것을 원합니다.

params.forEach((idx, e) -> query.bind(idx, e));

내가 지금 할 수있는 최선은 :

int idx = 0;
params.forEach(e -> {
  query.bind(idx, e);
  idx++;
});

색인 가능한 컬렉션 (목록 등)을 반복하므로 요소의 인덱스로 반복 할 수 있다고 가정합니다.

IntStream.range(0, params.size())
  .forEach(idx ->
    query.bind(
      idx,
      params.get(idx)
    )
  )
;

결과 코드는 병렬화가 용이하다는 점을 제외하고 고전적인 i ++ 스타일 for 루프를 사용하여 목록을 반복하는 것과 유사합니다 (물론 매개 변수에 대한 동시 읽기 전용 액세스가 안전하다고 가정).


현재 색인을 보유하는 하나의 요소로 배열을 캡처하면 매개 변수 와 함께 작동합니다 .

int[] idx = { 0 };
params.forEach(e -> query.bind(idx[0]++, e));

상기 코드는 상기 방법 것을 가정 대해 forEach가 발생 순으로 요소를 반복. Iterable 인터페이스는 달리 문서화되지 않는 한 모든 클래스에 대해이 동작을 지정합니다. 분명히 표준 라이브러리에서 Iterable의 모든 구현에 작동하며 나중에이 동작을 변경하면 이전 버전과의 호환성이 손상됩니다.

당신이 작업하는 경우 스트림 대신 컬렉션 / 반복 가능 객체는 , 당신은 사용해야 forEachOrdered을 하기 때문에, 대해 forEach가 동시에 실행될 수 있으며, 요소는 다른 순서로 발생할 수 있습니다. 다음 코드는 순차적 스트림과 병렬 스트림 모두에서 작동합니다.

int[] idx = { 0 };
params.stream().forEachOrdered(e -> query.bind(idx[0]++, e));

해결 방법이 있지만 스트림으로 처리하고 정직하게하는 깨끗하고 짧고 달콤한 방법은 없습니다.

int idx = 0;
for (Param p : params) query.bind(idx++, p);

참고 URL : https://stackoverflow.com/questions/22793006/java-8-foreach-with-index

반응형