2016-02-05 74 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... 

返回的東西作爲一個字符串。 我有這樣的東西,但它只是一個所有成分的字符串。我不知道如何添加比薩餅名稱和\ n後的成分

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

2.Second的事情是我需要回到最廉價的辣(至少一種成分是辛辣)比薩餅。我知道我必須爲比薩配辣配料,我知道我必須總結材料的價格,但我真的不知道該怎麼做。

如果有人能以任何可能的方式幫助我,我會很感激。

回答

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