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