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

原创
07/16 17:50
阅读数 54

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));

展开阅读全文
打赏
0
0 收藏
分享
加载中
更多评论
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部