Я хотел бы создать список или карту по списку внутри объекта, используя потоки java - PullRequest
1 голос
/ 16 июня 2020

Чтение «Java 8 в действии» Я создал практическое упражнение, чтобы поместить объект, например, в очередь сообщений:

У меня есть объект, внутри которого есть список. Я хотел бы сгруппировать список этих объектов с потоками по элементам из списка объектов. Мне нужна карта или хотя бы список, см. Пример.

Пример:

Beverage cola = new Beverage("Cola", Arrays.asList("cubes", "lemon"));
Beverage tea = new Beverage("Tea", Arrays.asList("sugar", "milk", "lemon"));


class Beverage{
    String name;
    List<String> adds;

    public Beverage(String name, List<String> adds) {
        this.name = name;
        this.adds = adds;
    }

    public String getName() {
        return name;
    }

    public List<String> getAdds() {
        return adds;
    }

    @Override
    public String toString() {
        return "Beverage{" +
            "name='" + name + '\'' +
            ", adds=" + adds +
            '}';
    }
}

У меня есть это:

final Map<List<String>, Beverage> collect = beveragesMenu.stream()
.collect(Collectors.toMap(Beverage::getAdds, beverage -> beverage));

, и он дает:

Key: [cubes, lemon]: Beverage{name='Cola', adds=[cubes, lemon]}
Key: [sugar, milk, lemon]: Beverage{name='Tea', adds=[sugar, milk, lemon]}

, но мне нужна карта:

Key: [cubes]: Beverage{name='Cola', adds=[cubes, lemon]}
Key: [sugar,]: Beverage{name='Tea', adds=[sugar, milk, lemon]}
Key: [milk]: Beverage{name='Tea', adds=[sugar, milk, lemon]}
Key: [lemon]: Beverage{name='Tea', adds=[sugar, milk, lemon]},Beverage{name='Cola', adds=[cubes, lemon]}

или / и список:

Beverage{name='Cola', adds=[cubes]}
Beverage{name='Cola', adds=[lemon]}
Beverage{name='Tea', adds=[sugar]}
Beverage{name='Tea', adds=[milk]}
Beverage{name='Tea', adds=[lemon]}

Ответы [ 3 ]

1 голос
/ 16 июня 2020

Вы можете сделать что-то подобное. Обычно для каждого «добавления» создается карта, затем каждая запись карты помещается в список. Вы также можете создавать из них новые объекты Beverage.

    public static void main(String[] args) {
        Beverage cola = new Beverage("Cola", Arrays.asList("cubes", "lemon"));
        Beverage tea = new Beverage("Tea", Arrays.asList("sugar", "milk", "lemon"));

        Stream.of(cola, tea)
                .map(Main::mapBeverage)
                .flatMap(map -> map.entrySet().stream())
                .collect(Collectors.toList())
                .forEach(System.out::println);

    }

    private static Map<String, Beverage> mapBeverage(Beverage beverage) {
        return beverage.getAdds()
                .stream()
                .collect(Collectors.toMap(
                        add -> add,
                        add -> beverage
                ));
    }

Он выводит:

lemon=Beverage{name='Cola', adds=[cubes, lemon]}
cubes=Beverage{name='Cola', adds=[cubes, lemon]}
lemon=Beverage{name='Tea', adds=[sugar, milk, lemon]}
milk=Beverage{name='Tea', adds=[sugar, milk, lemon]}
sugar=Beverage{name='Tea', adds=[sugar, milk, lemon]}
1 голос
/ 16 июня 2020

Предполагая, что у вас есть список напитков, например:

List<Beverage> myBeverageList = List.of(new Beverage("Cola", Arrays.asList("cubes", "lemon")),
                                        new Beverage("Tea", Arrays.asList("sugar", "milk", "lemon"))
                                       );

, вы можете создать сопоставление ингредиентов и списка напитков:

Map<String, List<Beverage>> ingredientsToBeverageMapping = myBeverageList.stream()
    .flatMap(bev -> bev.getAdds().stream()
            .map(ingr -> new AbstractMap.SimpleEntry<>(ingr, bev)))
    .collect(Collectors.groupingBy(Map.Entry::getKey,
            Collectors.mapping(Map.Entry::getValue, Collectors.toList())));
1 голос
/ 16 июня 2020

Для чего-то вроде этого я предлагаю вам go с flatMap

Код:

public List<Beverage> beverages = Arrays.asList(cola, tea);
beverages.stream()
         .flatMap(beverage -> beverage.getAdds().stream().map(add -> new Beverage(beverage.getName(), Collections.singletonList(add))))
         .collect(Collectors.toList())

Вывод :

[
    Beverage{name='Cola', adds=[cubes]}, 
    Beverage{name='Cola', adds=[lemon]}, 
    Beverage{name='Tea', adds=[sugar]}, 
    Beverage{name='Tea', adds=[milk]}, 
    Beverage{name='Tea', adds=[lemon]}
]
...