Java流对象列表

Java流对象列表,java,java-8,java-stream,Java,Java 8,Java Stream,我在使用java流时遇到问题。我有两门课: 披萨班 public class Pizza { private final String name; private final List<Ingredient> ingredients; // ... } 我需要使用流,但我对这方面还很陌生。 首先,我需要制作格式化菜单: 我有一个列表,在使用streams之后,它应该返回如下内容 pizza_name: ingredient1_preetyname, ingr

我在使用java流时遇到问题。我有两门课: 披萨班

public class Pizza {
    private final String name;
    private final List<Ingredient> ingredients;
    // ...
}
我需要使用流,但我对这方面还很陌生。 首先,我需要制作格式化菜单: 我有一个
列表
,在使用streams之后,它应该返回如下内容

pizza_name: ingredient1_preetyname, ingredient2_preetyname...\npizza2_name...
一串。 我有类似的东西,但它只是一系列的所有成分。我不知道如何在配料后添加披萨名称和\n

String lista=pizzas.stream()
                    .flatMap(p -> p.getIngredients().stream())
                    .map(i ->i.getPreetyName())
                    .collect(Collectors.joining(", "));
2.第二件事是我需要退回最便宜的辣味比萨饼(至少有一种配料是辣味的)。我知道我必须在比萨中加入辛辣的配料,我知道我必须计算配料的价格,但我真的不知道该怎么做


如果有人能以任何可能的方式帮助我,我将不胜感激。

您可以通过以下方式获得所需字符串:

String str =
    pizzas.stream()
          .map(p -> p.getName() + ": " + 
                     p.getIngredients().stream()
                                       .map(Ingredient::getPreetyName)
                                       .collect(Collectors.joining(", "))
          )
          .collect(Collectors.joining(System.lineSeparator()));
这将创建所有比萨饼的
流。对于一个比萨饼,我们需要将它映射到相应的字符串表示形式,即它的名称,后跟所有漂亮的配料名称,并用逗号连接

最后,当我们有了所有比萨饼的字符串时,我们可以再次加入它,这次用行分隔符分隔


至于你的第二个问题,关于寻找最便宜的比萨饼,我假设比萨饼的价格是所有配料价格的总和。在这种情况下,您可以通过只保留辛辣的比萨(这是通过查看任何配料是否辛辣获得的)并返回比较器比较比萨配料价格总和的最小值来过滤所有比萨

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);

Collectors.joining(…)
支持前缀,因此您可以使用
Collectors.joining(“,”,p.getName()+”:“,”)
…非常感谢,这正是我想要的,太好了。
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);