Java 8 中 Lambda 入门体验

99 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第5天,点击查看活动详情

什么是 Lambda 表达式

在普遍的编程语言中,Lambda 表达式(或函数)是匿名函数。例如,一个函数没有任何名称或者标识符,但却带有一些参数与方法体。一个箭头(->)用于分隔参数列表和正文。

在 Java 中,Lambda 表达式是表示函数接口实例的表达式。

类似于 Java 中的其他类型,Lambda 表达式也有类型,它们的类型是功能接口类型。可以在编辑器中Lambda 表达式左侧查看其类型。

Lambda 函数接口中只能存在一个抽象方法,存在多个会编译失败

image.png
不过该接口也可以声明 java.lang.Object 类中的抽象方法,但该接口仍然可以被称为函数接口。

如图所示:

image.png

带参数的函数接口

例如: (a,b) -> { return a+""+b; }

@FunctionalInterface
interface ParmsInterface {
    String ab(int a, int b);
}

public class LambdaDemo1 {
    public static void main(String[] args) {
        ParmsInterface parmsInterface = (a, b) -> a + "KFC crazy Thursday." + b;
        System.out.println(parmsInterface.ab(10, 20));
    }
}

输出:

10KFC crazy Thursday.20

使用 Lambda 来遍历集合

使用 Lambda 来遍历 List 集合:

List<String> list = new ArrayList<String>() {{
    add("Kim");
    add("Jimmy");
    add("Sol");
}};
list.forEach(s -> {
    System.out.println(s);
});

tips:不要再 foreach 中执行 remove 方法

使用 Lambda 来遍历 Map 集合:

Map<String, Integer> map = new HashMap<String, Integer>() {{
    put("kim", 23);
    put("Jimmy", 25);
    put("Sol", 26);
}};
map.forEach((k, v) -> {
    System.out.println("姓名: " + k + ",年龄: " + v + " 岁.");
});

输出:

姓名: Sol,年龄: 26 岁.
姓名: kim,年龄: 23 岁.
姓名: Jimmy,年龄: 25 岁.

过滤集合数据

如下案例,展示了在过滤器集合数据中使用 Lambda 表达式。

import lombok.Data;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;

public class LambdaFilter {

    public static void main(String[] args) {
        List<Staff> staffList = new ArrayList<>();
        staffList.add(new Staff("张三", 10000));
        staffList.add(new Staff("李四", 20000));
        staffList.add(new Staff("王二", 30000));
        staffList.add(new Staff("马五", 40000));
        staffList.add(new Staff("罗六", 2000));

        List<Staff> staffFilter = staffList.stream()
                .filter(s -> s.getWage() >= 20000)
                .collect(Collectors.toList());

        staffFilter.forEach(System.out::println);


    }

    @Data
    public static class Staff {

        private String name;

        private int wage;

        public Staff(String name, int wage) {
            this.name = name;
            this.wage = wage;
        }
    }
}

输出:

LambdaFilter.Staff(name=李四, wage=20000)
LambdaFilter.Staff(name=王二, wage=30000)
LambdaFilter.Staff(name=马五, wage=40000)

主要的代码如下:

List<Staff> staffFilter = staffList.stream()
        .filter(s -> s.getWage() >= 20000)
        .collect(Collectors.toList());

staffList.stream() : 把 List 集合放进流中进行处理
filter: 根据表达式中的条件进行过滤
collect: 取流过滤后的结果重新整合为 List 新的集合