Java8官方文档

Lambda表达式:

Lambda表达式语法基础:

​ 关键运算符: -> (箭头操作符或Lambda 操作符)

格式:Lambda 表达式参数列表 -> Lambda 表达式中所需要执行的功能,即Lambda 体

语法格式一:无参数,无返回值。

​ () ->System.out.println(“Hello”);

语法格式二:有一个参数,并且无返回值。

​ (e) -> System.out.println(e);

语法格式三:若只有一个参数,参数的小括号可以省略。

​ e -> System.out.println(e);

语法格式四:有两个以上的参数,又返回值,有多条执行语句。

​ (x,y)-> {

​ System.out.println(“Lambda”);

​ return Integer.compare(x,y);

​ };

语法格式五:如果有两个以上的参数,又返回值,只有一条执行语句,Lambda 体的大括号和return可以省略。

​ Comparatorcon=(x,y)->Integer.compare(x,y);

语法格式六:Lambda表达式的参数列表的数据类型可以省略不写,因为JVM编译器可以通过上下文推断出数据类型,即“类型推断”。

​ (Integer x,Integery)->Integer.compare(x,y);

函数式接口:

Lambda表达式函数式接口的使用情景:

函数式接口:只定义一个抽象方法的接口

如:

1
2
3
4
5
6
7
8
9
10
@FunctionalInterface
public interface Comparator<T> {
int compare(T o1, T o2);
}


@FunctionalInterface
public interface Runnable {
public abstract void run();
}
1
2
//使用案例
Comparator<Integer> cmp = (o1, o2) -> o2 - o1;

Stream:

Stream(流)是一个来自数据源的元素队列并支持聚合操作

我们通常对数组集合等数据进行stream操作

  1. 在进行流操作前,我们需要将这些数据流化,即data.stream()

  2. 得到数据的流对象后,我们才能使用Stream中的API对其进行操作!

    以下是一些常用的API:

    • map

      map 方法用于映射每个元素到对应的结果,以下代码片段使用 map 输出了元素对应的平方数:

      1
      2
      3
      List<Integer> numbers = Arrays.asList(3, 2, 2, 3, 7, 3, 5);
      // 获取对应的平方数
      List<Integer> squaresList = numbers.stream().map( i -> i*i).distinct().collect(Collectors.toList());
    • filter

      filter 方法用于通过设置的条件过滤出元素。以下代码片段使用 filter 方法过滤出空字符串:

      1
      2
      3
      List<String>strings = Arrays.asList("abc", "", "bc", "efg", "abcd","", "jkl");
      // 获取空字符串的数量
      long count = strings.stream().filter(string -> string.isEmpty()).count();
    • limit

      limit 方法用于获取指定数量的流。 以下代码片段使用 limit 方法打印出 10 条数据:

      1
      2
      Random random = new Random();
      random.ints().limit(10).forEach(System.out::println);
    • sorted

      sorted 方法用于对流进行排序。以下代码片段使用 sorted 方法对输出的 10 个随机数进行排序:

      1
      2
      Random random = new Random();
      random.ints().limit(10).sorted().forEach(System.out::println);

综合例子🌰:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public static List<People> createPeople(){
return Arrays.asList(
new People("Bob", 1),
new People("Zlan", 0),
new People("Clerk", 0),
new People("Don", 1),
new People("Eric", 0)
);
}

List<People> people = createPeople();
List<String> name = people.stream()
.filter(o1 -> o1.getSex() == 0)
.map(o1 -> o1.getName().toUpperCase())
.sorted(Comparator.reverseOrder())
.limit(2)
.collect(Collectors.toList());
System.out.println(name);

本文为小白作者对java8新特性中的Lambda表达式以及Stream相关API的粗浅了解,仅仅介绍了一些常见的用法,详细的用法以及底层实现原理并未深究,

参考文章: