Javaはストリーム:隣接する値の一致を見つけるための最も簡単な方法を

今夜:

どのようにストリームにコードのこの反復ブロックを変換することは可能でしょうか?

Integer prev = -1;
boolean adjacentPair = false;

for(Integer num : numberList) {
    if (num.equals(prev)) {
        adjacentNumberSame = true;
        break;
    }
    prev = num;
}
return adjacentNumberSame 
X00:

これは、1つのそれを行うには(それほど大きくない)方法です。

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()) );
}

PS。私はお勧めしませんreduce、それは@のvbezhenarの答えに使用されます。それは短絡しないので、あなたがここに見ることができるようhttps://repl.it/repls/DisastrousWideRevisioncontrolを(例外を探してください)

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=4943&siteId=1