java8 Lambda表达式 详解

1、Lambda表达式

Lambda表达式(也称为闭包),Lambda允许把函数作为一个方法的参数(函数作为参数传递进方法中),或者把代码看成数据。一个lambda可以由用逗号分隔的参数列表、–>符号与函数体三部分表示
*A、一般语法*
    (Type1 param1, Type2 param2, ..., TypeN paramN) -> {
          statment1;
          statment2;
          //.............
          return statmentM;
    }

B、简略语法
1、 参数类型省略–绝大多数情况,编译器都可以从上下文环境中推断出lambda表达式的参数类型。这样lambda表达式就变成了:

(param1,param2, ..., paramN) -> {
  statment1;
  statment2;
  //.............
  return statmentM;
}

2、当lambda表达式的参数个数只有一个,可以省略小括号。lambda表达式简写为:

param1 -> {
  statment1;
  statment2;
  //.............
  return statmentM;
}

3、当lambda表达式只包含一条语句时,可以省略大括号、return和语句结尾的分号。lambda表达式简化为:

param1 -> statment

例子
a、java8之前写法:

List<String> names = new ArrayList<>();
        names.add("苹果");
        names.add("香蕉");
        //普通用户
        List<String> lowercaseNames = new ArrayList<>();
        for (String name : names) {
          lowercaseNames.add(name.toLowerCase());
        }

b、简略写法

List<String> names = new ArrayList<>();
        names.add("苹果");
        names.add("香蕉");
List<String> lowercaseNamesLambda1 = names.stream().map(
                (name) -> {return name.toLowerCase();}
                ).collect(Collectors.toList());

c、一个参数省略小括号写法

List<String> names = new ArrayList<>();
        names.add("苹果");
        names.add("香蕉");
//一个参数时可以省略小括号
        List<String> Lambda1 = names.stream().map(name -> {
            return name.toLowerCase();
        }).collect(Collectors.toList());

d、省略大括号、return和语句结尾的分号

List<String> names = new ArrayList<>();
        names.add("苹果");
        names.add("香蕉");
//省略大括号、return和语句结尾的分号
        List<String> Lambda2 = names.stream().map(
                name -> name.toLowerCase()
                ).collect(Collectors.toList());

通过若干例子学习

创建Command接口:

public interface Command {

    /** 未知的接口行为需要实现
     */
      void  process ( int [] tagrs);
}

数组求和接口实现
public class AddCommand implements Command{

@Override
public void process(int[] tagrs) {
    int sum=0;
    for (int i : tagrs) {
        sum+=i;
    }
    System.out.println("数组求和输出"+sum);
}

}

数组输出接口实现

public class PrintComment implements Command{
    @Override
    public void process(int[] tagrs) {
         for (int i : tagrs) {
                System.out.print("数组迭代输出="+i);
            }
         System.out.println();
    }
}

通过ProcessArray 类确定 行为处理

public class ProcessArray {
    //通过ProcessArray 类确定 行为处理
    public void process(int[] tagrs, Command com) {
        com.process(tagrs);
    }
}

CommonTest测试类

public class CommonTest {
    public static void main(String[] args) {
        ProcessArray processArray=new ProcessArray();
        int tagrs[] ={0,6,2,4,5};
        /**
         * 数组输出行为
         */
        processArray.process(tagrs, new PrintComment());

        /**
         * 数组求和行为
         */
        processArray.process(tagrs, new AddCommand());
        /**
         * 数组排序行为 内部类实现
         */
        processArray.process(tagrs, new Command() {

            @Override
            public void process(int[] tagrs) {
                Arrays.sort(tagrs);
                processArray.process(tagrs, new PrintComment());
            }
        });
        /**
         * 数组求和行为 Lambda 实现
         */
        processArray.process(tagrs,tagr->{
            int sum=0;
            for (int i : tagrs) {
                sum+=i;
            }
            System.out.println("数组求和输出"+sum);
        });
        /**
         * 创建线程 --java8 之前写法
         */
        new Thread(new Runnable() {
            @Override
            public void run() {
            System.out.println("java8 之前写法");
            }
        }).start();

        //创建线程  ---Java 8方式:
        new Thread( () -> System.out.println("java8 写法 ") ).start();
    }
}

参数从 无到 有的写法


public class lamTest {
    // 吃饭接口
    interface Eatable {
            void taste();
    }
        // 飞行接口
    interface Flyable {
        void fly(String weather);
    }
    // 相加接口
    interface Addable {
        void add(int a, int b);
    }

    public void eat(Eatable e) {
        e.taste();
    }
    public void drive(Flyable e) {
        e.fly("天气明媚");
    }
    public void sum(Addable e){
        e.add(2, 8);
    }

    public static void main(String[] args) {
        lamTest test = new lamTest();
        /**
         *  参数为空  用()    ,->后面为 接口中需要输出的内容 
         */
        test.eat(()->System.out.println("正在吃!。。。"));

        /**
         * 参数为接口中的 weather
         */
        test.drive( weather-> {
            System.out.println("今天天气"+weather);
        });
        //不同的写法  
        test.drive((String weather)-> 
            System.out.println("今天天气"+weather)
        );

        /**
         * 求和
         */
        test.sum((int a,int b)->{
            int c =a+b;
            System.out.println("和为="+c);
        });

    }
}

由上述写法发现Lambda表达式的作用就是代替匿名内部类的繁琐写法,Lambda代替匿名内部类创建对象时,表达式的代码将会代替实现抽象方法的方法体.

总结:Lambda表达式的学习在于 ,在实践中学习,在实践中理解。建议大家还是多写代码,多使用

源码见地址:
http://download.csdn.net/download/u011105400/10176475

2、函数式接口 - Functional Interface

1.函数式接口(Functional Interface):
函数式接口, 首先是一个接口,在这个接口里面只能有一个抽象方法。也称为SAM接口
1.1函数式接口里允许定义默认
1.2 函数式接口里允许定义静态
1.3 函数式接口里允许定义java.lang.Object里的public
1.4 函数式接口里允许子接口继承多个父接口,但每个父接口中都只能存在一个抽象方法,且必须的相同的抽象方法

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值