java 8 流的學習----篩選和切片
阿新 • • 發佈:2018-12-15
篩選、切片和匹配 查詢、匹配和歸約 使用數值範圍等數值流 從多個源建立流 無限流
/** * 篩選和切片 */ public class Demo01 { public static void main(String[] args) { List<Dish> menues = Arrays.asList(new Dish("rice", true, 12, Dish.Type.FISH), new Dish("meat", false, 12, Dish.Type.FISH), new Dish("dog", true, 12, Dish.Type.FISH)); List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 1, 2, 4); List<Dish> dishes = filter01(menues); List<Integer> eventNumbers = filter02(numbers); List<Dish> dishes2 = filter03(menues); List<Dish> dishes3 = filter04(menues); List<Dish> meatDish = filterMeat(menues); } /** * 用謂詞篩選: * 篩選出所有素菜 */ public static List<Dish> filter01(List<Dish> menues) { return menues.stream().filter(Dish::isVegetarian).collect(Collectors.toList()); } /** * 篩選各異的元素: * 以下程式碼會篩選出列表中所有的偶數,並確保沒有 * 重複 */ public static List<Integer> filter02(List<Integer> numbers) { // Set<Integer> collect = numbers.stream().filter(number -> number % 2 == 0).collect(Collectors.toSet()); return numbers.stream().filter(number -> number % 2 == 0).distinct().collect(Collectors.toList()); } /** * 截短流: * 流支援limit(n)方法,該方法會返回一個不超過給定長度的流。所需的長度作為引數傳遞 * 給limit。如果流是有序的,則最多會返回前n個元素。比如,你可以建立一個List,選出熱量 * 超過300卡路里的頭三道菜: */ public static List<Dish> filter03(List<Dish> numbers) { return numbers.stream().filter(dish -> dish.getCalories() > 300).limit(3).collect(Collectors.toList()); } /** * 跳過元素: * 流還支援skip(n)方法,返回一個扔掉了前n個元素的流。如果流中元素不足n個,則返回一 * 個空流。請注意,limit(n)和skip(n)是互補的!例如,下面的程式碼將跳過超過300卡路里的頭 * 兩道菜,並返回剩下的 */ public static List<Dish> filter04(List<Dish> numbers) { return numbers.stream().filter(dish -> dish.getCalories() > 300).skip(2).collect(Collectors.toList()); } /** * 篩選前兩個葷菜 */ public static List<Dish> filterMeat(List<Dish> numbers) { return numbers.stream().filter(dish -> Dish.Type.MEAT.equals(dish.getType())).limit(2).collect(Collectors.toList()); } }