오늘 :
어떻게 스트림에 코드의 반복 블록을 변환 할 수 있을까요?
Integer prev = -1;
boolean adjacentPair = false;
for(Integer num : numberList) {
if (num.equals(prev)) {
adjacentNumberSame = true;
break;
}
prev = num;
}
return adjacentNumberSame
x00에서 :
이 일을 할 수있는 (너무 큰되지 않음) 방법입니다 :
IntStream.range(1, numberList.size())
.anyMatch(i -> numberList.get(i).equals(numberList.get(i-1)));
당신이 경우 numberList
이다 ArrayList
또는 비슷한 복잡성이 허용됩니다. 그렇지 않다면, 당신은 더 나은 사용하십시오 iterator
. 그래서 같이 :
var Iter = list.stream().iterator();
var res = list.stream()
.skip(1)
.map(v -> v.equals(Iter.next()) )
.anyMatch(v -> v)
;
더 우아한 방법은 일부 타사 라이브러리가 필요 zip
기능을. 로 zip
그 같이 할 수 있습니다 :
var res = zip(
list.stream().skip(1),
list.stream(),
(a, b) -> a.equals(b)
).anyMatch(x->x);
또는 당신은 당신의 자신을 작성할 수 있습니다 zip
. 이 같은:
public static <A,B,C> Stream<C> zip(Stream<A> listA, Stream<B> listB, BiFunction<A,B,C> zipper){
var iB = listB.iterator();
return listA.filter( a -> iB.hasNext())
.map( a -> zipper.apply(a, iB.next()) );
}
추신. 내가 권하고 싶지 않다 reduce
는 @의 vbezhenar의 대답에 사용. 이 단락 회로되지 않습니다 때문에, 당신이 여기에서 볼 수 있듯이 https://repl.it/repls/DisastrousWideRevisioncontrol를 (예외보기)