今夜:
どのようにストリームにコードのこの反復ブロックを変換することは可能でしょうか?
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を(例外を探してください)