のは、我々はこのストリームJavaストリーム:2つの要素を1つではなく1つずつ取り出す方法はありますか?
Stream.of("a", "b", "err1", "c", "d", "err2", "e", "f", "g", "h", "err3", "i", "j");
を持っていると私は最初の1で始まるした隣接する文字列のカップルが「誤る」マップに保存したいとしましょう。
私は何を考えると、この
Map<String, String> map = new HashMap<>();
Stream.of("a", "b", "err1", "c", "d", "err2", "e", "f", "g", "h", "err3", "i", "j")
.reduce((acc, next) -> {
if (acc.startsWith("err"))
map.put(acc,next);
if (next.startsWith("err"))
return next;
else
return "";
});
のようなものです。しかし、私はreduce
機能を「悪用」しています2つの主な理由
- のためのそれとは全く満足していません。 Stream APIでは、すべての関数に明確な明確な目的があります。
max
は最大値を計算することになっています。filter
は条件に基づいてフィルタリングすることになっています。reduce
は徐々に累積された値を生成すると考えられます。 - このようにすると、Streamsの強力なメカニズムを使用できなくなります。検索結果を最初の2つの検索結果に限定したい場合、どうすればよいでしょうか?
ここで、それはあなたが、何らかの形で、バック「現在値」と「次の値」に似た何かにつながることができますが、値のカップルを比較することができますのみの機能です(私の知る限りでは)ので、私はreduce
を使用概念。
もっと簡単な方法はありますか?それぞれの反復ごとに複数の値を考慮してストリームを反復できるものがありますか?
EDIT
は私が考えていることは、現在の要素を考えると、あなたは反復ごとに、検討する「要素の窓」を定義することができ、いくつかのメカニズムです。現在のAPIへの強力な "アップグレード" になり
<R> Stream<R> mapMoreThanOne(
int elementsBeforeCurrent,
int elementsAfterCurrent,
Function<List<? super T>, ? extends R> mapper);
代わりの
<R> Stream<R> map(Function<? super T, ? extends R> mapper);
よう
何か。
EDIT2
私は彼らのソリューションを提案し、人々の努力に感謝しますが、問題は、アルゴリズムそのものではありません。ストリーム、インデックス、以前の値を格納するための一時変数をまとめることで私の目標を達成する方法はいくつかありますが、現在の要素以外の要素を扱うために設計されたStream APIには、 "ストリームのパラダイム"を壊すことなく。答えを考えると、この
List<String> list =
Stream.of("a", "b", "err1", "c", "d", "err2", "e", "f", "g", "h", "err3", "i", "j")
.filterFunctionImWonderingIfExist(/*filters couples of elements*/)
.limit(2)
.collect(Collectors.toList());
ような何か、私は「明確かつ迅速な」解決策はありませんだと思う、StreamExライブラリ
コレクタが必要なように見えます – Bohemian
私はそれについて考えましたが、(すてきで清潔な)解決策を見つけることができませんでした –