Prepared Data:
public static List<Dish> menu = Arrays.asList(
new Dish("pork", false, 800, Dish.Type.MEAT)
, new Dish("beef", false, 700, Dish.Type.MEAT)
, new Dish("chicken", false, 400, Dish.Type.MEAT)
, new Dish("french fries", true, 530, Dish.Type.OTHER)
, new Dish("rice", true, 350, Dish.Type.OTHER)
, new Dish("season fruit", true, 120, Dish.Type.OTHER)
, new Dish("pizza", true, 550, Dish.Type.OTHER)
, new Dish("prawns", false, 300, Dish.Type.FISH)
, new Dish("prawns", false, 300, Dish.Type.FISH)
, new Dish("salmon", false, 450, Dish.Type.FISH) );
}
public class Dish {
public Dish(String name, boolean vegetarian, int calories, Type type) {
this.name = name;
this.vegetarian = vegetarian;
this.calories = calories;
this.type = type;
}
public String getName() {
return name;
}
public int getCalories() {
return calories;
}
public boolean isVegetarian() {
return vegetarian;
}
public Type getType() {
return type;
}
private final String name;
private final boolean vegetarian;
private final int calories;
private final Type type;
public enum Type {MEAT, FISH, OTHER}
}
sum (reduce)
static void sumReducing(){
Optional<Integer> sum = DataDemo.menu.stream()
.map(dish -> dish.getCalories())
.reduce(Integer::sum);
System.out.println(sum.get());
}
sum(mapToInt)
static void sumReducing(){
Optional<Integer> sum = DataDemo.menu.stream()
.map(dish -> dish.getCalories())
.reduce(Integer::sum);
System.out.println(sum.get());
}
append string(reducing)
static void collectReducing(){
String menuShortName = DataDemo.menu.stream()
.map(Dish::getName)
.collect(reducing((c1, c2) -> c1+c2)).get();
System.out.println(menuShortName);
}
append string(reducing2)
static void reducing3Params(){
String nameForShort = DataDemo.menu.stream()
.collect(reducing("", Dish::getName, (name1, name2) -> name1+name2));
System.out.println(nameForShort);
}
group
static void collectGroup(){
Map<Dish.Type, List<Dish>> map = DataDemo.menu.stream()
.collect(groupingBy(Dish::getType));
}
group2
private enum CaloriesType {LOW, NORMAL, HIGH};
static void collectManualGroup(){
Map<CaloriesType, List<Dish>> map = DataDemo.menu.stream().collect(groupingBy(dish -> {
if(dish.getCalories()<400) return CaloriesType.LOW;
else if(dish.getCalories()<700) return CaloriesType.NORMAL;
else return CaloriesType.HIGH;
}));
System.out.println(map);
}