天天看点

Java - 函数式编程,Lambda 表达式

Lambda 表达式

public void expr1() {
    /*
     * 在最简单的形式中,一个lambda可以由用逗号分隔的参数列表、–>符号与函数体三部分表示
     */
    Arrays.asList("a", "b", "c").forEach(e -> System.out.println(e));
    Arrays.asList(1, 2, 3).forEach((Integer e) -> {
      e *= 2;
      System.out.println(e);
    });
  }      

Java标准库中的java.lang.Runnable和java.util.Comparator都是典型的函数式接口

Comparator 接口 - 函数式排序

public void expr2() {
    /*
     * 1. Lambda可能会返回一个值
     * 2. 返回值的类型也是由编译器推测出来的
     * 3. 如果lambda的函数体只有一行的话,那么没有必要显式使用return语句
     */
    List<Integer> list = Arrays.asList(5, 7, 2, 3); 
    //Lambda表达式“(x, y) -> y - x”实现了java.util.Comparator接口
//    list.sort((e1, e2) -> e1.compareTo(e2)); // 升序
    list.sort((e1, e2) -> e2.compareTo(e1)); // 降序
    System.out.println(list);
  }      

Runnable 接口

import org.junit.Test;

public class ThreadUseLambda {
  /*
   * 对于函数式接口:
   * 除了可以使用Java中标准的方法来创建实现对象之外,还可以使用lambda表达式来创建实现对象
   * 比如:
   * Java标准库中的java.lang.Runnable和java.util.Comparator都是典型的函数式接口
   */
  public void sum(int a, int b) {
    System.out.println(a+b);
  }
  @Test
  public void runThreadUseLambda() {
    // 线程1
      new Thread(() -> {
          sum(1, 3);
      }).start();
      // 线程2
      new Thread(() -> {
        sum(2, 4);
      }).start();
  }
}      

函数式接口Function

Java SE 8增加了 java.util.function 包,里面都是可以在开发中使用的函数式接口。开发人员也可以创建新的函数式接口。

package redis.practice;

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

public class CollectionUtils {
    /*
     * map 函数:
     * 参数: input; processor -> Function -> T, 参数; R, 返回值
     */
    public static  List<String> map(List<String> input, Function<String, String> processor) {
        ArrayList<String> result = new ArrayList<String>();
        for (String obj : input) {
            // Function apply -> 执行函数业务逻辑
            result.add(processor.apply(obj));
        }
        return result;
    }
    public static void main(String[] args) {
        List<String> input = Arrays.asList(new String[] {"apple", "orange", "pear"});
        List<String> lengths = CollectionUtils.map(input, (String v) -> String.valueOf(v.length()));
        List<String> uppercases = CollectionUtils.map(input, (String v) -> v.toUpperCase());
        System.out.println(lengths);
        System.out.println(uppercases);
    }
}      

​​参考博客​​

​​官方文档​​

方法和构造方法引用

List input = Arrays.asList(new String[] {"apple", "orange", "pear"});
input.forEach((v) -> System.out.println(v));
input.forEach(System.out::println);      
List dateValues = Arrays.asList(new Long[] {0L, 1000L});
List dates = CollectionUtils.map(dateValues, Date::new);