Java函數式編程之Consumer和Predicate

歡迎大家訪問我的個人博客:L_SKH’Blog

一、Consumer

我們先來看它的源碼:(我們只來看他第一個方法)它是一個可以傳參的接口,擁有一個accept方法。

@FunctionalInterface
public interface Consumer<T> {

    /**
     * Performs this operation on the given argument.
     *
     * @param t the input argument
     */
    void accept(T t);
}

讓我們根據它的定義來使用它看看:

import java.util.function.Consumer;

/**
 * @Created IntelliJ IDEA.
 * @Author L_SKH
 * @Date 2019/11/16 19:06
 */
public class ConsumerApp {
    public static void main(String[] args) {
        StringBuilder builder = new StringBuilder("SKH");
        Consumer consumer1 = new Consumer<StringBuilder>() {
            @Override
            public void accept(StringBuilder stringBuilder) {
                stringBuilder.append("_X") ;
            }
        } ;
        consumer1.accept(builder);
        System.out.println(builder);

    }

}

輸出:
SKH_X
來看一下集合的一個forEach方法:

@Override
    public void forEach(Consumer<? super E> action) {
        Objects.requireNonNull(action);
        final int expectedModCount = modCount;
        @SuppressWarnings("unchecked")
        final E[] elementData = (E[]) this.elementData;
        final int size = this.size;
        for (int i=0; modCount == expectedModCount && i < size; i++) {
            action.accept(elementData[i]);
        }
        if (modCount != expectedModCount) {
            throw new ConcurrentModificationException();
        }
    }

看到那個Consumer了沒,我們來應用一下,同時在jdk8之後有了lambda的使用,我們可以在更加簡化一下Consumer的定義:

import java.util.function.Consumer;

/**
 * @Created IntelliJ IDEA.
 * @Author L_SKH
 * @Date 2019/11/16 19:06
 */
public class ConsumerApp {
    public static void main(String[] args) {
        StringBuilder builder = new StringBuilder("SKH");
        Consumer<StringBuilder> consumer = (str)->{
          str.append("_L") ;
        } ;  //Lambda的應用
        consumer.accept(builder);
        System.out.println(builder);
        ArrayList<Integer> integers = new ArrayList<>();
        integers.add(5) ;
        integers.add(9) ;
        integers.add(8) ;
        integers.add(7) ;
        integers.forEach((data)->{
            System.out.println(data);
        });

    }

}

二、Predicate

還是來先看他的源碼:它也是一個可以傳參的接口,與Consumer不同的是它有一個可以返回boolean類型的函數。所以我們可以用它來當做一個filter

@FunctionalInterface
public interface Predicate<T> {

    /**
     * Evaluates this predicate on the given argument.
     *
     * @param t the input argument
     * @return {@code true} if the input argument matches the predicate,
     * otherwise {@code false}
     */
    boolean test(T t);
}

應用:輸出一個集合中大於10的元素,我們結合Consumer來編寫代碼:

package org.skh.c025;

import java.awt.print.Pageable;
import java.util.ArrayList;
import java.util.function.Predicate;

/**
 * @Created IntelliJ IDEA.
 * @Author L_SKH
 * @Date 2019/11/16 19:20
 */
public class PredicateApp {
    public static void main(String[] args) {
        Predicate<Integer> predicate = (data)->{
            if (data>10) {
                return true;
            }
            return false ;
        } ;
        ArrayList<Integer> integers = new ArrayList<>();
        integers.add(5) ;
        integers.add(12) ;
        integers.add(8) ;
        integers.add(11) ;
        integers.forEach((data)->{
            if (predicate.test(data)){
                System.out.println(data);
            }else{
                System.out.println("data<10");
            }
        });

    }
}

輸出:

data<10
12
data<10
11
Process finished with exit code 0
發佈了147 篇原創文章 · 獲贊 62 · 訪問量 9萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章