lambda表達式與函數式編程
- 2019 年 10 月 7 日
- 筆記
01—引
lambda表達式是java支持函數式編程的實現方案,很多高級語言已經支持lambda表達式,像python、javascript等。lambda表達式使代碼更加簡潔,而且在理解了語法之後,可讀性也更加好。
02—語法
無參數
// 1. 無參數 // 1.8版本之前 寫法 new Thread(new Runnable() { @Override public void run() { System.out.println("Hello world !"); } }).start(); // lambda 寫法 new Thread(() -> System.out.println("Hello world !")).start();
接受一個參數
- value省略了類型
- 省略了參數的小括號
- 也省略了函數體的大括號
- forEach 也行函數式編程的寫法
List<String> list = Arrays.asList("one", "two", "three"); // 原寫法 for(String value : list){ System.out.println(value) } // lambda 寫法 list.forEach(value -> System.out.println(value)); // 函數式編程寫法 list.forEach(System.out::println);
接受兩個參數
// 原寫法 list.sort(new Comparator<String>() { @Override public int compare(String o1, String o2) { return o1.compareTo(o2); } }); // lambda 寫法 list.sort((String o1, String o2) -> (o1.compareTo(o2))); // 函數式編程寫法 list.sort(String::compareTo);
方法引用
objectName::instanceMethod ClassName::staticMethod ClassName::instanceMethod
構造器引用
ClassName::new
使用場景
- 匿名類
- 線程
- 比較器
- 回調
- 集合操作
- 類似python的集合操作
- 和stream組合
List<Integer> list = Arrays.asList(4, 7, 9, 12, 0, 18, 8, 10, 3); // 取最小值 Integer minValue = list.stream().min((Integer o1, Integer o2) -> (o1.compareTo(o2))).get(); // 排序 取前5位 List<Integer> topFive = list.stream().sorted((Integer o1, Integer o2) -> (o1 - o2)).limit(5).collect(Collectors.toList()); // 打印 大於 10的數 list.stream().filter((v) -> v > 10).forEach(System.out::print);
02—函數式接口 包java.util.function下提供很多函數式接口:
Function 輸入參數為類型T, 輸出為類型R, 記作 T -> R;
// 打印元素的平方 List<Integer> list = Arrays.asList(4, 7, 9, 12, 0, 18, 8, 10, 3); Function<Integer, Integer> square = x -> x * x; // 平方 list.forEach(x -> System.out.println(square));
Consumer 輸入參數為類型T, 輸出為void, 記作 T -> void;
// 打印元素 List<Integer> list = Arrays.asList(4, 7, 9, 12, 0, 18, 8, 10, 3); Consumer<Integer> print = System.out::println; // 打印操作 list.forEach(print);
Supplier 沒有輸入參數, 輸出為類型T, 記作 void -> T;
List<Integer> list = Arrays.asList(4, 7, 9, 12, 0, 18, 8, 10, 3); Supplier<Integer> instance = () -> (1); // 固定值 1 list.add(instance.get());
Predicate 輸入參數為類型T, 輸出為類型boolean, 記作 T -> boolean
List<Integer> list = Arrays.asList(4, 7, 9, 12, 0, 18, 8, 10, 3); Predicate<Integer> isEven = x -> x % 2 == 0; // 是否偶數 list.forEach(isEven::test);
還包括二元函數式接口、其他函數式接口,基本上平時編程足夠使用,另外也可以自定義函數式接口:
- @FunctionalInterface 非必須加的註解;
- 接口中只能包含一個方法;
@FunctionalInterface public interface IHandler { void execute(String v); } public class Lambdas { // 自定義函數式接口 private void customize() { // 匿名類寫法 IHandler handler = new IHandler() { @Override public void execute(String v) { System.out.println(v); } }; handler.execute("匿名類寫法"); // lambda 寫法 IHandler handler_lambda = System.out::println; handler_lambda.execute("lambda寫法"); // 方法引用 IHandler handler_functional = this::execute; handler_functional.execute("方法引用寫法寫法"); } private void execute(String v) { System.out.println(v); } }
1、https://blog.csdn.net/xinghuo0007/article/details/78607166
2、https://blog.csdn.net/xinghuo0007/article/details/78603908