我在使用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...
作为一个字符串。 我有这样的东西,但它只是一串所有成分。我不知道如何添加披萨名称和\ n后成分
String lista=pizzas.stream()
.flatMap(p -> p.getIngredients().stream())
.map(i ->i.getPreetyName())
.collect(Collectors.joining(", "));
2.第二件事是我需要返回最便宜的辣味(至少一种成分是辣的)披萨。我知道我必须为辣配料配上比萨饼,我知道我必须总结配料价格,但我真的不知道该怎么做。
如果有人能以任何可能的方式帮助我,我将感激不尽。
答案 0 :(得分: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>
。对于一个披萨,我们需要将它映射到相应的String表示,这是它的名字,然后是用逗号连接的所有漂亮的成分名称。
最后,当我们为所有比萨饼提供所有这些字符串时,我们可以再次加入它,这次用行分隔符分隔。
至于你关于检索最便宜的披萨的第二个问题,我会假设披萨的价格是其所有成分价格的总和。在这种情况下,您可以通过仅保留辛辣的比萨来过滤所有比萨饼(这是通过查看是否有任何成分是辣的而获得)并且比较比较物的最小比较比较比萨饼成分的价格总和。
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);