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.

-2
Pryda 6 Okt. 2020 im 17:38

3 Antworten

Beste Antwort

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));
}
2
Eritrean 6 Okt. 2020 im 15:10

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());
}
0
Taslim Oseni 6 Okt. 2020 im 21:44

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.

0
Magnilex 6 Okt. 2020 im 17:20