Java8 函式式介面與Lambda及其應用
阿新 • • 發佈:2021-01-19
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)); } }