Java流对象列表

Mol*_*ioo 3 java java-8 java-stream

我有使用java流的麻烦.我有两个班:比萨班

public class Pizza {
    private final String name;
    private final List<Ingredient> ingredients;
    // ...
}
Run Code Online (Sandbox Code Playgroud)

和成分类与那些:

private final String preetyName;
private final int price;
private final boolean meat;
private final boolean spicy;
Run Code Online (Sandbox Code Playgroud)

我需要使用流,但我对此很新.首先我需要制作格式化的菜单:我有List<Pizza>和使用流后它应该返回这样的东西

pizza_name: ingredient1_preetyname, ingredient2_preetyname...\npizza2_name...
Run Code Online (Sandbox Code Playgroud)

作为一个字符串.我有这样的东西,但它只是一串所有成分.我不知道如何添加披萨名称和\n后成分

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

2.第二件事是我需要退回最便宜的辣味(至少一种成分是辣的)披萨.我知道我必须为辣的配料配上比萨饼,我知道我必须总结配料价格但我真的不知道该怎么做.

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

Tun*_*aki 7

您可以使用以下命令获取所需的字符串:

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

这创造了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);
Run Code Online (Sandbox Code Playgroud)

  • `Collectors.joining(...)`支持前缀,所以你可以使用`Collectors.joining(",",p.getName()+":","")`... (2认同)