[解決済み] JDK8でlambdaを使ってストリームをZIPする (java.util.stream.Streams.zip)
2022-04-24 12:29:57
質問
JDK 8 でラムダ b93 を使用する場合、クラスがありました。 java.util.stream.Streams.zip は b93 に含まれます。 これはストリームの圧縮に使用できます (これはチュートリアルで説明されています。 Java8 Lambdasを探求する。パート1 by Dhananjay Nene ). この関数は :
遅延かつ連続した結合Streamを作成する。 2つのストリームの要素を結合した結果である。
しかし、b98ではこれがなくなりました。実際には
Streams
クラスにはアクセスできません。
b98 の java.util.stream
.
この機能は移動されたのでしょうか?もしそうなら、b98 を使ってストリームを簡潔に圧縮するにはどうすればよいのでしょうか?
私が考えているアプリケーションは このShenのjava実装では でZIP機能を置き換えたものです。
-
static <T> boolean every(Collection<T> c1, Collection<T> c2, BiPredicate<T, T> pred)
-
static <T> T find(Collection<T> c1, Collection<T> c2, BiPredicate<T, T> pred)
関数に、かなり冗長なコード(b98の機能は使っていない)を追加しました。
解決方法は?
私もこれが必要だったので、b93からソースコードを取ってきて、"util" クラスに入れました。現在のAPIで動作させるために、少し修正する必要がありました。
参考までに、以下が動作するコードです(自己責任でお願いします...)。
public static<A, B, C> Stream<C> zip(Stream<? extends A> a,
Stream<? extends B> b,
BiFunction<? super A, ? super B, ? extends C> zipper) {
Objects.requireNonNull(zipper);
Spliterator<? extends A> aSpliterator = Objects.requireNonNull(a).spliterator();
Spliterator<? extends B> bSpliterator = Objects.requireNonNull(b).spliterator();
// Zipping looses DISTINCT and SORTED characteristics
int characteristics = aSpliterator.characteristics() & bSpliterator.characteristics() &
~(Spliterator.DISTINCT | Spliterator.SORTED);
long zipSize = ((characteristics & Spliterator.SIZED) != 0)
? Math.min(aSpliterator.getExactSizeIfKnown(), bSpliterator.getExactSizeIfKnown())
: -1;
Iterator<A> aIterator = Spliterators.iterator(aSpliterator);
Iterator<B> bIterator = Spliterators.iterator(bSpliterator);
Iterator<C> cIterator = new Iterator<C>() {
@Override
public boolean hasNext() {
return aIterator.hasNext() && bIterator.hasNext();
}
@Override
public C next() {
return zipper.apply(aIterator.next(), bIterator.next());
}
};
Spliterator<C> split = Spliterators.spliterator(cIterator, zipSize, characteristics);
return (a.isParallel() || b.isParallel())
? StreamSupport.stream(split, true)
: StreamSupport.stream(split, false);
}
関連
-
[解決済み] リスト内包とラムダ+フィルタの比較
-
[解決済み] クロージャ」と「ラムダ」の違いは何ですか?
-
[解決済み] Distinct() with lambda?
-
[解決済み] ラムダ(関数)とは何ですか?
-
[解決済み] javaストリームで整数のリストを合計する方法は?
-
[解決済み] Java 8のストリーム内部からCHECKED例外を投げるにはどうすればよいですか?
-
[解決済み】C++11のラムダ式って何?
-
[解決済み】ストリームを使った地図作成で重複を無視する。
-
[解決済み】Java 8 Streams: 複数のフィルタと複雑な条件の比較
-
[解決済み] JDK8でlambdaを使ってストリームをZIPする (java.util.stream.Streams.zip)
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン