Java8 Lambda表达式

1.引入Lambda表达式的背景

      Lambda使得在多线程中分布处理集合更容易,在Java8中,目的是,不是要提供给集合这样一些方法,他们有一定的功能且每一个以不同的方式来处理他们的元素,集合现在可以组织自己的内部迭代,将并行化的责任从客户端转成内部库实现。而且在传递过程中可以将方法作为参数传递,对于一个复杂的处理流程,每一个步骤产生的结果都会马上传递给下一个步骤,如果能得到满足条件的参数,马上会终止计算。

      简单说,Lambda表达式就是一个不用被绑定在标识符上,并且可能被调用的函数。

2.Lambda语法详解

(Type1 param1, Type2 param2, ..., TypeN paramN) -> {
  statment1;
  statment2;
  //.............
  return statmentM;
}
     Lambda表达式三个重要的组成部分是:输入参数,可执行语句,存放外部变量的空间。

List<String> names = new ArrayList<>();
names.add("MeiTuan");
names.add("DianPing");
 
List<String> lowercaseNames = names.stream().map((String name) -> {return name.toLowerCase();}).collect(Collectors.toList());
       Lambda的实现是依附于函数式接口的,对于这种接口,只声明了一个方法,所以参数的类型和顺序都是固定的,上面的公式进而可以演化成

List<String> names = new ArrayList<>();
names.add("MeiTuan");
names.add("DianPing");
 
List<String> lowercaseNames = names.stream().map(name -> name.toLowerCase()).collect(Collectors.toList());
      我们在集合中写的比较集合内元素的大小。

String[] oldWay = "help with lambda".split(" ");
Arrays.sort(oldWay, new Comparator<String>() {
    public int compare(String s1, String s2) {
        // 忽略大小写排序:
        return s1.toLowerCase().compareTo(s2.toLowerCase());
    }
});
System.out.println(String.join(", ", oldWay));
可以直接简单写为

String[] newWay = "help with lambda".split(" ");
Arrays.sort(newWay, (s1, s2) -> {
    return s1.toLowerCase().compareTo(s2.toLowerCase());
});
System.out.println(String.join(", ", newWay));

3.函数式接口

      函数式接口是只包含一个抽象方法声明的接口。每个Lambda表达式都能隐式的赋值给函数式接口,例如:

Consumer<Integer>  c = (int x) -> { System.out.println(x) };
BiConsumer<Integer, String> b = (Integer x, String y) -> System.out.println(x + " : " + y);
Predicate<String> p = (String s) -> { s == null };
      @FunctionalInterface是Java8的新接口,用于指明该接口类型声明是根据Java语言规范定义的函数式接口。函数式接口只能有一个抽象方法,如果尝试添加第二个抽象方法,将抛出编译时错误。

//Old way:
List<Integer> list = Arrays.asList(1,2,3,4,5,6,7);
int sum = 0;
for(Integer n : list) {
    int x = n * n;
    sum = sum + x;
}
System.out.println(sum);
 
//New way:
List<Integer> list = Arrays.asList(1,2,3,4,5,6,7);
int sum = list.stream().map(x -> x*x).reduce((x,y) -> x + y).get();
System.out.println(sum);

4.Lambda表达式和匿名类的区别

      对于关键词方面,对于匿名类,关键词this解读为匿名类,而对于Lambda表达式,关键词this解读为Lambda的外部类。









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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值