Ich möchte einen Stream von Objekten in eine Karte konvertieren. Der Schlüssel ist das Objekt selbst und der Wert ist Function.identity()
. Mein Ziel ist es, für jede Person einen inkrementellen Index zu erstellen.
public class Person {
private String firstName;
private String lastName;
}
/* Expected Result
Key:[Person1], value:1
Key:[Person2], value:2
Key:[Person3], value:3
*/
public Map<Person, Integer> getMapOfPersons(Stream<Person> persons) {
return persons.filter(p -> "John".equalIgnoreCase(p.getFirstName)
.collect(Collectors.toMap(Person, Function.identity()));
}
Mein Problem ist, dass ich nach dem Anwenden von .filter()
mein Objekt nicht als Schlüssel (oder sogar Wert) in die .toMap()
-Methode einfügen kann.
3 Antworten
Sie können es in zwei Schritten schaffen:
public Map<Person, Integer> getMapOfPersons(Stream<Person> persons) {
List<Person> filterd = persons.filter(p -> "John".equalIgnoreCase(p.getFirstName))
.collect(Collectors.toList());
return IntStream.range(0, filterd.size())
.boxed()
.collect(Collectors.toMap(filterd::get, i -> i + 1));
}
Sie können so etwas ausprobieren:
public Map<Person, Integer> getMapOfPersons(Stream<Person> persons) {
AtomicInteger counter = new AtomicInteger(0);
return persons.filter(p -> "John".equalIgnoreCase(p.getFirstName())
.collectors.toMap(p->p, counter.getAndIncrement());
}
Sie können AtomicInteger
verwenden, um einen ansteigenden Wert als Wert für Ihr Map
zu generieren:
public Map<Person, Integer> getMapOfPersons(Stream<Person> persons) {
final AtomicInteger atomicInteger = new AtomicInteger();
return persons
.filter(p -> "John".equalsIgnoreCase(p.getFirstName()))
.collect(Collectors.toMap(Function.identity(), notUsed -> atomicInteger.incrementAndGet()));
}
Achten Sie darauf, dies nicht mit parallelen Streams zu verwenden, da dies von der Reihenfolge der Verarbeitung abhängt. Es werden jedoch eindeutige Werte gerendert, da AtomicInteger
threadsicher ist.
Neue Fragen
java
Java ist eine Programmiersprache auf hoher Ebene. Verwenden Sie dieses Tag, wenn Sie Probleme haben, die Sprache selbst zu verwenden oder zu verstehen. Dieses Tag wird selten alleine verwendet und wird am häufigsten in Verbindung mit [spring], [spring-boot], [jakarta-ee], [android], [javafx], [hadoop], [gradle] und [maven] verwendet.