Wie 2 Listen werden können Ströme und 1,8 Funktionen verbunden mit?

AB11:

Ich habe eine ListPreis- und Preisgruppen.

static class PriceGroup {
    String priceName;
    String priceGroup;
}

static class Price {
    String priceName;
    Integer price;
}

Im Folgenden finden Sie einige Beispieldaten und eine Implementierung schrieb ich für jede Preisgruppe den niedrigsten Preis zu finden. Irgendwelche Vorschläge, wie ich konnte Refactoring diese Ströme zu verwenden, diese Daten zu kommen?

List<PriceGroup> priceGroups = Arrays.asList(
        new PriceGroup("F1", "Friends"),
        new PriceGroup("F2", "Friends"),
        new PriceGroup("O1", "Others"),
        new PriceGroup("O2", "Others"));

List<Price> prices = Arrays.asList(
        new Price("F1", 100),
        new Price("F2", 150),
        new Price("O1", 250),
        new Price("O2", 300));

public Map<String, Integer> getBestPrices(List<PriceGroup> priceGroups, List<Price> prices) 
{
    Map<String, Integer> bestPrice = new HashMap<String, Integer>(); 
    for (PriceGroup priceGroup : priceGroups) {
        if (bestPrice.get(priceGroup.priceGroup) == null) {
            bestPrice.put(priceGroup.priceGroup, 10000000);
        }

        for (Price price : prices) {
            if (price.priceName.equals(priceGroup.priceName)) {
                bestPrice.put(priceGroup.priceGroup, Math.min(price.price, bestPrice.get(priceGroup.priceGroup)));
            }
        }
    }

    return bestPrice;
}

Für die gegebenen Daten soll meine Funktion eine Karte zurückgeben mit:

F1 => 100
O1 => 250

ruslan:

Um 2 Listen verbunden könnten Sie betrachten dediziertes Objekt zu erstellen:

class Joined {
    String priceGroup;
    String priceName;
    Integer price;
    ...

Dann wird unter Verwendung flatMapSie können kommen , priceGroupsum pricesauf priceNamedurch Feld und Gruppe priceGroup:

Map<String, Optional<Joined>> map = priceGroups.stream()
        .flatMap(group -> prices.stream()
                .filter(p -> p.getPriceName().equals(group.getPriceName()))
                .map(p -> new Joined(group.getPriceGroup(), group.getPriceName(), p.getPrice())))
        .collect(groupingBy(Joined::getPriceGroup, minBy(Comparator.comparing(Joined::getPrice))));

Jetzt Werte von Karte bekommen können Sie erwartetes Ergebnis drucken:

for (Optional<Joined> value : map.values()) {
        value.ifPresent(joined -> System.out.println(joined.getPriceName() + " " + joined.getPrice()));
    }

// O1 250
// F1 100

Ich denke du magst

Origin http://43.154.161.224:23101/article/api/json?id=119099&siteId=1
Empfohlen
Rangfolge