이 질문
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] 삭제
몇 마디 만하겠습니다