1. 程式人生 > >第1篇 java 8 流的學習----篩選和切片

第1篇 java 8 流的學習----篩選和切片

篩選、切片和匹配
 查詢、匹配和歸約
 使用數值範圍等數值流
 從多個源建立流
 無限流

/**
 * 篩選和切片
 */
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());
    }
}