Lamdba表达式

java中无法将一个函数 作为参数传递给另一个方法,也无法声明返回一个函数的方法

Lamdba表示式结构:

param是函数体参数的数据类型,如下例子中的ActionEvent,如果没有参数就直接省略、如果没有返回值(void),函数体可以直接省略
在java中lamdba表达式是一个对象

(param1,param2,param3) -> {
    函数体
}

() -> {
    函数体
}

() -> {}

使用Lamdba表达式例子


    JButton jButton = new JButton("my jbutton");
    jButton.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {
            System.out.println("点击了按钮");
        }
    });
    JButton jButton = new JButton("my jbutton");
    //java进行类型的推断,event是ActionEvent类型,就不需要显式定义event
    jButton.addActionListener(event -> {
        System.out.println("点击了按钮");
    });

函数式接口

接口只有一个抽象方法,如果接口声明FunctionInterface注解,编译器会按照函数式接口来要求该接口,比如 Ruunable接口
:jdk8接口新增了一个默认实现的方法 default xxx

函数式接口例子

//MyInterFace父类为Object,toString方法为父类重写
@FunctionalInterface
interface MyInterFace {
    void face();
    String toString();
}

public class MyInterFaceLamdba {

    public void myTestInterface(MyInterFace myInterFace) {
        System.out.println(1);
        myInterFace.face();
        System.out.println(2);
    }

    public static void main(String[] args) {
        MyInterFaceLamdba test = new MyInterFaceLamdba();
        test.myTestInterface(() -> {//实现了抽象方法face()
            System.out.println("MyTestInterFace");
        });

        System.out.println("---------------");

        MyInterFace myInterFace = () -> {};

        System.out.println(myInterFace.getClass());
        System.out.println(myInterFace.getClass().getSuperclass());
        System.out.println(myInterFace.getClass().getInterfaces()[0]);
    }
}

1
MyTestInterFace
2
---------------
class ch.shafish.jdk8.MyInterFaceLamdba$$Lambda$2/1078694789
class java.lang.Object
interface ch.shafish.jdk8.MyInterFace

例子

List<Integer> list = Arrays.asList(1,2,3,4,5,6,7,8);
List<String> listString = Arrays.asList("hello","world","hello,world");

利用外部迭代器后移进行取值

for(int i = 0;i<list.size();++i) {
    System.out.println(list.get(i));
}

for (Integer i:list) {
    System.out.println(i);
}

依次拿出集合的结果传递给lamdba函数进行处理(输出)

//使用lamdba表达式
list.forEach(i -> {
    System.out.println(i);
});

//使用方法引用 :: 引用了 Consumer接口 进行处理.(先了解,后面会介绍)
list.forEach(System.out::println);
//使用内部迭代遍历list,改成大写后保存成新的list中,然后输出新list内容
List<String> resultList = new ArrayList<>();
list.forEach(item -> resultList.add(item));
resultList.forEach(item -> System.out.println(item));

//使用流的方式完成以上需求 (先了解,后面会介绍)
list.stream().map(item -> item.toUpperCase()).forEach(item -> System.out.println(item));
list.stream().map(String::toUpperCase).forEach(item -> System.out.println(item));