2016-02-05 6 views
3

У меня проблемы с использованием потоков java. У меня есть два класса: Пицца классаJava-потоки список объектов

public class Pizza { 
    private final String name; 
    private final List<Ingredient> ingredients; 
    // ... 
} 

и класса Ингредиент с тем:

private final String preetyName; 
private final int price; 
private final boolean meat; 
private final boolean spicy; 

мне нужно использовать потоки, но я довольно новыми для этого. Сначала мне нужно сделать форматированный меню: У меня есть List<Pizza> и после использования потоков он должен вернуть что-то вроде этого

pizza_name: ingredient1_preetyname, ingredient2_preetyname...\npizza2_name... 

в одну строку. У меня есть что-то вроде этого, но это всего лишь строка из всех ингредиентов. Я не знаю, как добавить имя пиццы и \ п после ингредиентов

String lista=pizzas.stream() 
        .flatMap(p -> p.getIngredients().stream()) 
        .map(i ->i.getPreetyName()) 
        .collect(Collectors.joining(", ")); 

2. Во-вторых, что мне нужно, чтобы вернуть дешевый пряный (по крайней мере, один ингредиент, пряный) пицца. Я знаю, что я должен питать пиццу для пряных ингредиентов, и я знаю, что мне приходится подводить цены на ингредиенты, но я честно не знаю, как это сделать.

Если кто-то может помочь мне любым возможным способом, я буду благодарен.

ответ

7

Вы можете получить строку, которую вы хотите со следующим:

String str = 
    pizzas.stream() 
      .map(p -> p.getName() + ": " + 
        p.getIngredients().stream() 
             .map(Ingredient::getPreetyName) 
             .collect(Collectors.joining(", ")) 
     ) 
      .collect(Collectors.joining(System.lineSeparator())); 

Это создает Stream<Pizza> всех пицц. Для одной пиццы нам нужно сопоставить ее с соответствующим строковым представлением, которое является его именем, за которым следуют все красивые имена ингредиентов, соединенных запятой.

Наконец, когда у нас есть все эти струны для всех пицц, мы можем присоединиться к нему снова, на этот раз отделенный разделителем строк.


Что касается вашего второго вопроса о получении дешевых пиццы, я буду считать, что цена пиццы является суммой стоимости всех его компонентов. В этом случае вы можете отфильтровать все пиццы, сохранив только пряные (это получается, если вы заметите, что какие-либо ингредиенты являются пряными) и возвращает минимум для компаратора, сравнивая сумму цены ингредиентов пиццы.

Pizza cheapestSpicy = 
    pizzas.stream() 
      .filter(p -> p.getIngredients().stream().anyMatch(Ingredient::isSpicy)) 
      .min(Comparator.comparingInt(
      p -> p.getIngredients().stream().mapToInt(Ingredient::getPrice).sum() 
     )).orElse(null); 
+2

'Collectors.joining (...)' поддерживает префикс, так что вы можете использовать 'Collectors.joining ("", p.getName() + ":", "")' ... – Holger

+1

Действительно большое спасибо , это именно то, что я искал, это здорово. – Molioo

Смежные вопросы