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