자바 스트림 : 인접한 값 일치를 찾을 수있는 가장 쉬운 방법은

오늘 :

어떻게 스트림에 코드의 반복 블록을 변환 할 수 있을까요?

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를 (예외보기)

추천

출처http://43.154.161.224:23101/article/api/json?id=4942&siteId=1