1、Stream介紹 java
如今有這樣的需求:有個菜單list,菜單裏面很是多的食物列表,只選取小於400卡路里的而且按照卡路里排序,而後只想知道對應的食物名字。api
代碼:less
package com.cy.java8; public class Dish { private final String name; private final boolean vegetarian; private final int calories; private final Type type; 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 boolean isVegetarian() { return vegetarian; } public int getCalories() { return calories; } public Type getType() { return type; } public enum Type {MEAT, FISH, OTHER} @Override public String toString() { return "Dish{" + "name='" + name + '\'' + ", vegetarian=" + vegetarian + ", calories=" + calories + ", type=" + type + '}'; } }
package com.cy.java8; import java.util.ArrayList; import java.util.Arrays; import java.util.Comparator; import java.util.List; import java.util.stream.Collectors; public class SimpleStream { public static void main(String[] args) { //have a dish list (menu) 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("salmon", false, 450, Dish.Type.FISH)); List<String> lowerCaloriesDish = getLowerCaloriesDish(menu); System.out.println(lowerCaloriesDish); List<String> lowerCaloriesDish2 = getLowerCaloriesDish2(menu); System.out.println(lowerCaloriesDish2); } /** * 用Stream的方式去寫 */ private static List<String> getLowerCaloriesDish2(List<Dish> menu){ return menu.stream().filter(dish -> dish.getCalories() < 400) .sorted(Comparator.comparing(d->d.getCalories())) .map(Dish::getName) .collect(Collectors.toList()); } /** * 之前的寫法 * 獲取卡路里小於400的食物列表,而且排好序,只返回食物的名字; * @param menu * @return */ private static List<String> getLowerCaloriesDish(List<Dish> menu){ List<Dish> lowerCalories = new ArrayList<>(); //filter and get calories less 400 for(Dish dish : menu){ if(dish.getCalories() < 400 ){ lowerCalories.add(dish); } } //sort lowerCalories.sort((o1, o2) -> o1.getCalories() - o2.getCalories()); List<String> lowerCaloreisDishList = new ArrayList<>(); for(Dish dish : lowerCalories){ lowerCaloreisDishList.add(dish.getName()); } return lowerCaloreisDishList; } }
console打印:ide
[season fruit, prawns, rice]
[season fruit, prawns, rice]
Stream:升級版的api,處理集合等等,有個好處是能夠並行處理,並且不須要關心並行處理的細節,ui
2、Stream的簡單用法介紹this
圍繞着stream的一些方法進行一些代碼的舉例:spa
package com.cy.java8; import java.util.*; import java.util.stream.Stream; public class SimpleStream { public static void main(String[] args) { //have a dish list (menu) 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("salmon", false, 450, Dish.Type.FISH)); System.out.println("method1 the max calories dish is: " + getMaxCaloriesDish(menu)); System.out.println("method2 the max calories dish is: " + getMaxCaloriesDish2(menu)); System.out.println("have dish calories larger than 600: " + foundDishCaloriesLarger600(menu)); System.out.println("all dish calories larger than 400: " + allDishCaloriesLarger400(menu)); System.out.println("---------------------------------------"); /** * 建立一個stream */ Stream<Dish> stream = Stream.of(new Dish("prawns", false, 300, Dish.Type.FISH), new Dish("salmon", false, 450, Dish.Type.FISH)); stream.forEach(System.out::println); } /** * 找出熱量最大的食物名字 */ private static String getMaxCaloriesDish(List<Dish> menu){ return menu.stream().max(Comparator.comparingInt(Dish::getCalories)).get().getName(); } /** * 找出熱量最大的食物,方法二 */ private static String getMaxCaloriesDish2(List<Dish> menu){ Optional<Dish> maxDish = menu.stream().sorted((d1, d2) -> d2.getCalories() - d1.getCalories()).findFirst(); return maxDish.get().getName(); } /** * 菜單裏面是否有食物熱量大於600 */ private static boolean foundDishCaloriesLarger600(List<Dish> menu){ boolean result = menu.stream().anyMatch(dish -> dish.getCalories() > 600); return result; } /** * 菜單裏面食物的熱量是否都大於400 */ private static boolean allDishCaloriesLarger400(List<Dish> menu){ boolean result = menu.stream().allMatch(dish -> dish.getCalories() > 400); return result; } }
打印結果:code
method1 the max calories dish is: pork method2 the max calories dish is: pork have dish calories larger than 600: true all dish calories larger than 400: false --------------------------------------- Dish{name='prawns', vegetarian=false, calories=300, type=FISH} Dish{name='salmon', vegetarian=false, calories=450, type=FISH}
--blog