Java 8 Function 函式介面

未讀程式碼發表於2021-07-21

這篇文章屬於 Java 8 教程(LTS)系列教程

在 Java 8 中,Function 介面是一個函式介面,它位於包 java.util.function 下。 Function 介面中定義了一個 R apply(T t) 方法,它可以接受一個泛型 T 物件,返回一個泛型 R 物件,即引數型別和返回型別可以不同。

Function 介面原始碼:

@FunctionalInterface
public interface Function<T, R> {

    R apply(T t);

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

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

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

1. Function apply

示例 1:輸入一個字串 <T> String, 返回字串的大寫形式 <R> String

package com.wdbyte;

import java.util.function.Function;

public class Java8Function {
    public static void main(String[] args) {
        Function<String, String> toUpperCase = str -> str.toUpperCase();
        String result = toUpperCase.apply("www.wdbyte.com");
        System.out.println(result);
    }
}

輸出結果:

WWW.WDBYTE.COM

示例 2:輸入一個字串 <T> String,返回字串的長度 <R> Integer

package com.wdbyte;

import java.util.function.Function;

public class Java8FunctionLength {
    public static void main(String[] args) {
        Function<String, Integer> lengthFunction = str -> str.length();
        Integer length = lengthFunction.apply("www.wdbyte.com");
        System.out.println(length);
    }
}

輸出結果:

14

2. Function andThen

Function 函式介面的 andThen() 方法可以讓多個 Function 函式連線使用。

示例:輸入一個字串,獲取字串的長度,然後乘上 2。

package com.wdbyte;

import java.util.function.Function;

public class Java8FunctionAndThen {
    public static void main(String[] args) {
        Function<String, Integer> lengthFunction = str -> str.length();
        Function<Integer, Integer> doubleFunction = length -> length * 2;
        Integer doubleLength = lengthFunction.andThen(doubleFunction).apply("www.wdbyte.com");
        System.out.println(doubleLength);
    }
}

結果:

28

3. List -> Map

示例:輸入一個字串 List 集合 <T> List<String> , 返回一個 key 為字串本身,Value 為字串長度的 Map

package com.wdbyte;

import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.function.Function;

public class Java8FunctionListToMap {

    public static void main(String[] args) {
        List<String> list = Arrays.asList("java", "nodejs", "wdbyte.com");
        // lambda 方式
        Function<String, Integer> lengthFunction = str -> str.length();
        Map<String, Integer> listToMap = listToMap(list, lengthFunction);
        System.out.println(listToMap);

        // 方法引用方式
        Map<String, Integer> listToMap2 = listToMap(list, String::length);
        System.out.println(listToMap2);
    }

    public static <T, R> Map<T, R> listToMap(List<T> list, Function<T, R> function) {
        HashMap<T, R> hashMap = new HashMap<>();
        for (T t : list) {
            hashMap.put(t, function.apply(t));
        }
        return hashMap;
    }
}

輸出結果:

{java=4, wdbyte.com=10, nodejs=6}
{java=4, wdbyte.com=10, nodejs=6}

4. List -> List<Other>

示例 :輸入一個字串 List 集合 <T> List<String> ,返回大寫形式的字串 List 集合,返回小寫形式的字串 List 集合。

package com.wdbyte;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.function.Function;

public class Java8FunctionString {

    public static void main(String[] args) {
        List<String> list = Arrays.asList("Java", "Nodejs", "Wdbyte.com");
        // 方法引用方式
        List<String> upperList = map(list, String::toUpperCase);
        List<String> lowerList = map(list, String::toLowerCase);
        System.out.println(upperList);
        System.out.println(lowerList);

        // Lambda 方式
        List<String> upperList2 = map(list, x -> x.toUpperCase());
        List<String> lowerList2 = map(list, x -> x.toLowerCase());
        System.out.println(upperList2);
        System.out.println(lowerList2);

    }

    public static <T, R> List<R> map(List<T> list, Function<T, R> function) {
        List<R> resultList = new ArrayList<>(list.size());
        for (T t : list) {
            resultList.add(function.apply(t));
        }
        return resultList;
    }
}

輸出結果:

[JAVA, NODEJS, WDBYTE.COM]
[java, nodejs, wdbyte.com]
[JAVA, NODEJS, WDBYTE.COM]
[java, nodejs, wdbyte.com]

參考

擴充套件閱讀

訂閱

可以關注未讀程式碼部落格或者微信搜尋「 未讀程式碼 」。

文章會在部落格和公眾號同步更新。

相關文章