스트림을 사용하여 인덱스 범위가 아닌 요소에 대해 한 가지 작업을 수행하고 범위 내에서 다른 작업을 수행하는 방법은 무엇입니까?

문맹의

이 질문

Java 8에서 인덱스로 스트림을 반복하는 간결한 방법이 있습니까?

다른 인덱스 스트림을 기반으로 한 스트림을 구동하는 방법을 설명합니다. 내 목표는 문자열 배열을 취하는 것입니다.

one two three four five six seven eight

배열 인덱스가 2에서 5 사이 인 요소를 모두 캡으로 처리합니다.

one two THREE FOUR FIVE SIX seven eight

나는 이것을하는 방법을 알아 냈지만, 내 본능은 그것에 대해 더 우아한 방법이 있어야한다고 말한다. 아래 예에서 첫 번째 스트림은 범위에있는 요소를 제외한 모든 요소를 ​​필터링합니다. 물론 내가 원하는 것은 아니지만 스트림을 사용하여 인덱스 범위로 필터링하는 방법과 비슷합니다. 두 번째는 내가 원하는 것을 대문자로 배열 요소를 제자리에서 변경합니다.

제자리에서 배열을 변경하는 방법과 두 개의 스트림이 필요한 방법이 마음에 들지 않습니다. 더 좋은 방법이 있습니까?

import static java.util.stream.Collectors.joining;

import java.util.Arrays;
import java.util.stream.IntStream;

public class UpperCaseElementsInIndexRangeViaIntStream {

   public static void main(String[] ignored) {
      final String input = "one two three four five six seven eight";
      final int MIN_IDX = 2;
      final int MAX_IDX = 5;
      final String[] splits = input.split(" ");

      //Filter only those in range

      String output = IntStream.range(0, splits.length).
            filter(idx -> MIN_IDX <= idx && idx <= MAX_IDX).
            mapToObj(i -> splits[i]).
            collect(joining(" "));

      System.out.println(output);

      //Change the array in place, capitalizing only those in range

      IntStream.range(0, splits.length).forEach(idx -> {
         final String split = splits[idx];
         splits[idx] = (MIN_IDX <= idx && idx <= MAX_IDX)
                       ? split.toUpperCase() : split;
      });

      output = Arrays.stream(splits).collect(joining(" "));

      System.out.println(output);
   }
}

산출:

three four five six
one two THREE FOUR FIVE SIX seven eight
보헤미아 사람

나는 또한 map(predicate, functionIfTrue, functionIfFalse)일종의 방법 이 있어야한다고 생각 했지만 그렇지 않습니다. 대신지도에서 삼항을 사용하세요.

final int[] idx = {-1}; // trick to get around "effectively final"
String result = Arrays.stream(input.split(" "))
   .map(s -> MIN_IDX <= ++idx[0] && idx[0] <= MAX_IDX ? s.toUpperCase() : s)
   .collect(joining(" "));

이것은 그 자체가 최종적이지만 내용이 변경 가능한 단일 요소 배열을 사용하여 반복의 인덱스를 가져 오는 트릭을 사용합니다.


일부 테스트 코드 :

final String input = "one two three four five six seven eight";
final int MIN_IDX = 2;
final int MAX_IDX = 5;
final int[] idx = {-1};
String result = Arrays.stream(input.split(" "))
    .map(s -> MIN_IDX <= ++idx[0] && idx[0] <= MAX_IDX ? s.toUpperCase() : s)
    .collect(joining(" "));
System.out.println(result);

산출:

one two THREE FOUR FIVE SIX seven eight

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

Related 관련 기사

뜨겁다태그

보관