Lassen Sie uns sagen, dass wir diesen Strom habenJava Stream: Gibt es eine Möglichkeit, iterativ zwei Elemente gleichzeitig zu verwenden?
Stream.of("a", "b", "err1", "c", "d", "err2", "e", "f", "g", "h", "err3", "i", "j");
und ich möchte, dass die Paare von benachbarten Saiten in einer Karte speichern, in der die erste beginnt mit „irren“.
Was ich dachte, der ist so etwas wie dies
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 "";
});
Aber ich bin nicht ganz zufrieden mit ihm aus zwei Gründen
- ich „missbräuchlich“
reduce
Funktion. In der Stream API hat jede Funktion ihren klaren, wohldefinierten Zweck:max
soll den maximalen Wert berechnen,filter
soll basierend auf einer Bedingung filtern,reduce
soll einen inkrementell akkumulierten Wert erzeugen und so weiter. - Das hindert mich daran, Streams mächtige Mechanismen zu verwenden: Was, wenn ich meine Suche auf die ersten beiden Ergebnisse beschränken wollte?
Hier verwendete ich reduce
weil (soweit ich weiß) es ist die einzige Funktion ist, die Sie vergleichen paar Werte können, die Sie irgendwie zu etwas führen wieder ähnlich wie bei „Stromwert“ und „nächste Wert“ Konzepte.
Gibt es einen einfacheren Weg? Etwas, das es Ihnen ermöglicht, den Stream zu iterieren, wobei für jede Iteration mehr als ein Wert berücksichtigt wird?
EDIT
Was ich denke, ist ein Mechanismus, der das aktuelle Element gegeben, Sie ein „Fenster der Elemente“ definieren können für jede Iteration zu berücksichtigen.
So etwas wie
<R> Stream<R> mapMoreThanOne(
int elementsBeforeCurrent,
int elementsAfterCurrent,
Function<List<? super T>, ? extends R> mapper);
statt
<R> Stream<R> map(Function<? super T, ? extends R> mapper);
, die eine leistungsstarke "Upgrade" zu aktuellen API wäre.
EDIT2
Ich schätze die Bemühungen der Menschen, ihre Lösung vorschlagen, aber das Problem ist nicht, den Algorithmus per se. Es gibt verschiedene Möglichkeiten, um mein Ziel zu erreichen, indem ich Streams, Indizes und temporäre Variablen zusammenfasse, um vorherige Werte zu speichern ... aber ich habe mich gefragt, ob es eine Methode in der Stream-API gibt, die für den Umgang mit anderen Elementen als dem aktuellen entwickelt wurde ohne das "Strom-Paradigma" zu brechen. So etwas wie dieses
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());
die Antworten gegeben, ich glaube, es gibt keine „klare und schnelle“ Lösung, es sei denn mit StreamEx Bibliothek
Sieht so aus, als ob Sie einen Collector brauchen – Bohemian
Ich dachte darüber nach, aber ich konnte keine (nette und saubere) Lösung finden –