jdk8中java.util.function包下 consumer,function,supplier,predicate使用

jdk8中java.util.function包下 consumer,function,supplier,predicate使用

@FunctionalInterface是用來做什麼的
標識這個接口是函數式接口,能夠用在lambda表達式上


consumer接口使用

//針對一個操作數
@FunctionalInterface
public interface Consumer<T> {
   //對給定t執行操作
    void accept(T t);
    //對給定t執行操作再執行after定義操作
    default Consumer<T> andThen(Consumer<? super T> after) {
        Objects.requireNonNull(after);
        return (T t) -> { accept(t); after.accept(t); };
    }
}


//這裏有兩個操作數t,u
public interface BiConsumer<T, U> {

    void accept(T t, U u);

  
    default BiConsumer<T, U> andThen(BiConsumer<? super T, ? super U> after) {
        Objects.requireNonNull(after);

        return (l, r) -> {
            accept(l, r);
            after.accept(l, r);
        };
    }
}


function


//接口 T代表輸入參數,R代表返回的結果
public interface Function<T, R> {
    R apply(T var1);

    default <V> Function<V, R> compose(Function<? super V, ? extends T> var1) {
        Objects.requireNonNull(var1);
        return (var2) -> {
            return this.apply(var1.apply(var2));
        };
    }

    default <V> Function<T, V> andThen(Function<? super R, ? extends V> var1) {
        Objects.requireNonNull(var1);
        return (var2) -> {
            return var1.apply(this.apply(var2));
        };
    }

    static <T> Function<T, T> identity() {
        return (var0) -> {
            return var0;
        };
    }
}

通過表達式可以實現實例化一個對象
Function<Integer, Integer> fun = x -> x + 1;
等號右側表達式正是抽象方法實現


java.unil.function.supplier

定義 supplier也是用來創建對象的,不同於傳統的創建語法對象,使用get時獲取不同的對象

predicate
//與
 default Predicate<T> and(Predicate<? super T> other) {
        Objects.requireNonNull(other);
        return (t) -> test(t) && other.test(t);
    }
//或
    default Predicate<T> negate() {
        return (t) -> !test(t);
    }
//取反
    default Predicate<T> or(Predicate<? super T> other) {
        Objects.requireNonNull(other);
        return (t) -> test(t) || other.test(t);
    }
eg 使用predicate條件進行篩選,修改時只需要通過方法變動即可
  int[] numbers = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15};
        List<Integer> list = new ArrayList<>();
        for (int num : numbers) {
            list.add(num);
        }

        Predicate<Integer> p1 = i -> i > 5;
        Predicate<Integer> p2 = i -> i < 20;
        Predicate<Integer> p3 = i -> i % 2 == 0;
        List<Integer> test = list.stream()
                .filter(p1.and(p2).and(p3))
                .collect(Collectors.toList());
        List<Integer> test1 = list.stream()
                .filter(p1.and(p2).and(p3.negate()))
                .collect(Collectors.toList());
        System.out.println(JSON.toJSONString(test));
        System.out.println(JSON.toJSONString(test1));

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章