Ho una situazione in cui sono presenti oggetti Player
in un progetto di sviluppo e l'attività sta semplicemente misurando la distanza e restituendo risultati che rientrano in una determinata soglia. Certo, voglio utilizzare gli stream nel modo più conciso possibile.Filtraggio di uno stream in base ai valori in una raccolta toMap
Attualmente, ho una soluzione che mappa il torrente, e poi filtra attraverso un iteratore:
Stream<Player> str = /* source of my player stream I'm filtering */;
Map<Player, Double> dists = str.collect(Collectors.toMap(...)); //mapping function
Iterator<Map.Entry<Player, Double>> itr = map.entrySet().iterator();
while (itr.hasNext()) {
if (itr.next().getValue() <= radiusSquared) {
itr.remove();
}
}
Tuttavia, quello che vorrei realizzare è qualcosa che svolge questo filtraggio mentre si utilizza il flusso su, qualcosa che dice "se questo predicato fallisce, non raccogliere", per tentare e salvare la seconda iterazione. Inoltre, non voglio calcolare le distanze due volte, quindi fare un filtro tramite la funzione di mappatura, e quindi re-mapping non è una soluzione plausibile.
L'unica soluzione reale possibile che ho pensato è mappare a un Pair<A, B>
, ma se c'è il supporto nativo per qualche forma di flusso binario, sarebbe meglio.
Esiste un supporto nativo per questo nell'API di flusso di java?
mostrare la vostra funzione di mappatura così – AdamSkywalker
@AdamSkywalker Non sono sicuro di come sia rilevante, ci vogliono gli oggetti 'Player' dal flusso e gli usi un metodo irrilevante per ottenere la distanza. Il modo in cui ciò viene fatto non è realmente rilevante per la domanda attuale (filtraggio basato sul valore restituito). lo pseudo-codice saggio è fondamentalmente lo stesso di 'streamPlayer.distance (origine)' dove 'origin' è al di fuori del flusso – Rogue
Che dire dell'utilizzo di [' Stream # filter'] (https://docs.oracle.com/javase/ 8/docs/api/java/util/stream/Stream.html # filtro java.util.function.Predicate-)? –