zoukankan      html  css  js  c++  java
  • Java8 新增的Lambda表达式

    引入

    使用匿名内部类(匿名内部类可参考:Java中的匿名内部类

    interface Command
    {
        void process(int[] target);
    }
    class ProcessArray
    {
        public  void process(int [] target, Command cmd)
        {
            cmd.process(target);
        }
    }
    public class CommandTest
    {
        public static void main(String[] args)
        {
            ProcessArray pa = new ProcessArray();
            int[] arr = {1,2,3,4};
            //使用匿名内部类
            pa.process(arr, new Command(){
                    public void process(int[] arr)
                    {
                        int sum =0;
                        for(int k : arr)
                            sum += k;
                        System.out.println(sum);
                    }
                }
            );
        }
    }
    View Code

    使用Lambda表达式,可以简化匿名内部类。(部分可以用Lambda表达式代替)

    interface Command
    {
        void process(int[] target);
    }
    class ProcessArray
    {
        public  void process(int [] target, Command cmd)
        {
            cmd.process(target);
        }
    }
    
    //Java8 新增了Lambda表达式,Lambda表达式完全可用于简化匿名内部类对象
    public class CommandTest
    {
        public static void main(String[] args)
        {
            ProcessArray pa = new ProcessArray();
            int[] arr = {1,2,3,4};
            //使用Lambda表达式
            pa.process(arr, (int[] arr1)->    //不能重复arr,错误: 已在方法 main(String[])中定义了变量 arr
                    {
                        int sum =0;
                        for(int k : arr1)
                            sum += k;
                        System.out.println(sum);
                    }
            );
        }
    }
    View Code

    Lambda的语法

    1. 参数列表。参数列表允许省略形参类型;若只有一个形参,甚至可省略参数列表的圆括号
    2. 箭头 ->
    3. 代码块。若只有一句,可省略{};

    Lambda表达式是有类型的,称为“目标类型(target type)”,它必须是函数式接口(functional interface)。
    函数式接口是只包含一个抽象方法的接口。函数式接口可以包含多个默认方法、类方法,但只能有一个抽象方法。
    Java8 提供了 @FunctionalInterface 注解,用于编译器检查接口是函数式接口,放在接口定义的前面。

        public static void main(String[] args)
        {
            //Lambda表达式的返回就是函数式接口的对象
            // Runnable 是Java中提供的一个接口,只有一个匿名方法 void run()
            Runnable r = () -> {
                int sum = 0;
                for(int i=0; i<=100; ++i)
                    sum += i;
                System.out.println(sum);
            };
            r.run();
        }

    *******************

    常记溪亭日暮,沉醉不知归路。兴尽晚回舟,误入藕花深处。争渡,争渡,惊起一滩鸥鹭。

    昨夜雨疏风骤,浓睡不消残酒。试问卷帘人,却道海棠依旧。知否?知否?应是绿肥红瘦。
  • 相关阅读:
    SignalR2结合ujtopo实现拓扑图动态变化
    SignalR2简易数据看板演示
    使用SignalR 2进行服务器广播
    使用SignalR实时Web应用程序
    ZooKeeper安装
    MongoDB安装
    线程安全与非线程安全
    监听器,事件对象,事件源
    Graphics与Canvas
    JDialog
  • 原文地址:https://www.cnblogs.com/htj10/p/12366065.html
Copyright © 2011-2022 走看看