1. 程式人生 > 實用技巧 >Java8 函式式介面與Lambda及其應用

Java8 函式式介面與Lambda及其應用

1) java 8 中 四大函式介面的使用
import java.util.function.Consumer;
import java.util.function.Function;
import java.util.function.Predicate;
import java.util.function.Supplier;

/**
 * @author 懂技術愛生活
 */
public class FunctionTester {
    public static void main(String args[]) {
        // Java 8 四大函式式介面
        
// 1-Function 函式式介面 // 提供抽象方法 : R apply(T t) Function<String, String> function = (par) -> par + " run!"; String function_result = function.apply("Function"); System.out.println(function_result); // 2-Predicate 斷定型介面 // 提供抽象方法 : boolean test(T t) Predicate<String> predicate = (str) -> { System.out.println(str
+ " run!"); return true; }; Boolean predicate_result = predicate.test("Predicate"); System.out.println(predicate_result); // 3-Consumer 消費型介面 // 提供抽象方法 : accept(T t) Consumer<String> consumer = (str) -> System.out.println(str); consumer.accept(
"Consumer run!"); // 4-Supplier 供給型介面 // 提供抽象方法 : T get() Supplier<String> supplier = () -> "Supplier run!"; System.out.println(supplier.get()); // 以 1-Function 函式式介面 為例 // lambda是實現函式式介面的一個快捷方式,效果等價於 Function<String, String> function2 = new Function<String, String>() { @Override public String apply(String s) { return s + " run!"; } }; String function_result2 = function2.apply("Function2"); System.out.println(function_result2); // 使用@FunctionalInterface註解自定義函式式介面 MyFun f = str -> System.out.println(str); f.say("MyFun run!"); } }

2) java 8 Lambda 應用
import java.util.Arrays;
import java.util.Comparator;
import java.util.List;
import java.util.stream.Collectors;

/**
 * @author 懂技術愛生活
 */
public class LambdaTester {

    public static void main(String[] args) {
        // 1-集合遍歷
        System.out.println("===== 1 =====");
        String[] para = {"1-para1", "1-para2", "1-para3", "0-para4", "0-para5"};
        List<String> params = Arrays.asList(para);
        // 1.1-以前的迴圈方式
        for (String p : params) {
            System.out.println("get : " + p);
        }
        // 1.2-使用 lambda 表示式
        params.forEach(p -> System.out.println("get : " + p));


        // 2-實現 Runnable介面
        System.out.println("===== 2 =====");
        // 2.1-以前的實現方式
        Runnable runnable1 = new Runnable() {
            @Override
            public void run() {
                System.out.println("runnable1 run!");
            }
        };
        runnable1.run();
        // 2.2-使用 lambda 表示式
        Runnable runnable2 = () -> System.out.println("runnable2 run!");
        runnable2.run();

        // 3-集合排序
        System.out.println("===== 3 =====");
        // 3.1-以前的實現方式
        Arrays.sort(para, new Comparator<String>() {
            @Override
            public int compare(String o1, String o2) {
                return o1.compareTo(o2);
            }
        });
        params = Arrays.asList(para);
        params.forEach(p -> System.out.println("get : " + p));
        // 3.2-使用 lambda 表示式
        Arrays.sort(para, (String o1, String o2) -> {
            return o1.compareTo(o2);
        });
        params = Arrays.asList(para);
        params.forEach(p -> System.out.println("get : " + p));

        //4-使用Lambdas和Streams
        // Stream是對集合的包裝,通常和lambda一起使用。 使用lambdas可以支援許多操作,如 map, filter, limit, sorted, count, min, max, sum, collect 等
        // filter->map->sorted->collect
        System.out.println("===== 4 =====");
        // filter
        System.out.println("filter:");
        params.stream().filter(p -> p.indexOf('0') >= 0).forEach(p -> System.out.println("get : " + p));
        // sorted
        System.out.println("sorted:");
        params.stream().sorted((String p1, String p2) -> p1.compareTo(p2)).forEach(p -> System.out.println("get : " + p));
        // map & collect
        System.out.println("map & collect1:");
        List result1 = params.stream().map(p -> p.toUpperCase()).collect(Collectors.toList());
        result1.forEach(p -> System.out.println("1 get : " + p));
        // 知識點:stream 中
        // 使用:person -> person.getAge();
        // 效果等同:Person::getAge
        // 使用:new HashMap<>()
        // 效果等同HashMap::new
        System.out.println("map & collect2:");
        List result2 = params.stream().map(String::toUpperCase).collect(Collectors.toList());
        result1.forEach(p -> System.out.println("2 get : " + p));

    }
}