1. 程式人生 > >java8 流的簡單使用程式碼記錄

java8 流的簡單使用程式碼記錄

package daily_test;

import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.Optional;
import java.util.OptionalInt;
import java.util.stream.Collectors;

public class Test2 {
    public static void main(String[] args) {
        List<Integer> list = new ArrayList<>();
        list.add(1);
        list.add(50);
        list.add(60);
        list.add(60);
        list.add(90);

        Integer result;

        /** 求最大值*/
        Optional<Integer> optional = list.stream().max(Comparator.comparingInt(Integer::intValue));
        result = optional.orElse(null);
        System.out.println("求最大值(1):" + result);

        Optional<Integer> optional1 = list.stream().max((o1, o2) -> o1 - o2);
        result = optional1.orElse(null);
        System.out.println("求最大值(2):" + result);

        // mapToInt 返回的是數值流 IntStream。 mapToDouble, mapToLong
        OptionalInt optionalInt = list.stream().mapToInt(Integer::intValue).max();
        result = optionalInt.orElse(0);
        System.out.println("求最大值(3):" + result);

        /** 求和 */
        result = list.stream().reduce(0, (integer1, integer2) -> integer1 + integer2);
        System.out.println("求和(1):" + result);

        result = list.stream().reduce(0, Integer::sum);
        System.out.println("求和(2):" + result);

        /** 過濾 filter(Predicate) filter返回的是條件判斷中結果為true,並非是過濾掉 */
        result = list.stream().filter(integer4 -> integer4 == 50).findFirst().orElse(0);
        System.out.println("刷選符合條件的:" + result);

        /** 去重 */
        List<Integer> newList = list.stream().distinct().collect(Collectors.toList());

        /** 擷取流前 N 個元素 limit(N) */
        newList = list.stream().limit(2).collect(Collectors.toList());

        /** 排除流的前 N 個元素 skip(N) */
        newList = list.stream().skip(2).collect(Collectors.toList());

        /** 流中是否包含 x 這個元素 anyMatch(element -> element.equals(x) || element == x) */
        boolean flag = list.stream().anyMatch(integer -> integer == 50);

        /** 從流中獲取隨機元素 findAny() */
        Optional<Integer> any = list.stream().findAny();
        result = any.orElse(0);

        /**
         * Optional 用於防止出現NullpointException
         *
         * isPresent()
         * 判斷容器中是否有值
         *
         * ifPresent(Consume lambda)
         * 容器若不為空則執行括號中的Lambda表示式。
         *
         * T get()
         * 獲取容器中的元素,若容器為空則丟擲NoSuchElement異常。
         *
         * T orElse(T other)
         * 獲取容器中的元素,若容器為空則返回括號中的預設值。
         */
        Optional<Integer> optional3 = list.stream().max((o1, o2) -> o1 - o2);
        // 1
        result = optional3.isPresent() ? optional3.get() : null;
        // 2
        result = optional3.orElse(null);
        // 上面的 1 和 2 是等價的
    }
}