Java Lambda表达式使用总结

Java Lambda表达式使用总结

1. 什么是Lambda表达式

lambda表达式是Java 8中的新特性,相信很多人已经在实际开发中使用此特性提高开发效率,熟练使用lambda表达式可有效减少代码冗余,提高代码可读性,下面列举2个简单的例子理解一下:

  • 线程
Thread thread = new Thread(new Runnable() {
       @Override
        public void run() {
             System.out.println("hello");
        }
});
thread.start();

//lambda写法
Thread thread1 = new Thread(() -> System.out.println("hello"));
thread1.start();
  • 排序
 List<Integer> nums = Arrays.asList(3,5,4,6);
 Collections.sort(nums, new Comparator<Integer>() {
          @Override
          public int compare(Integer o1, Integer o2) {
                return o1.compareTo(o2);
          }
 });
 
 //lambda写法
 Collections.sort(nums, (o1,o2) -> o1.compareTo(o2));

很明显,使用lambda表达式后代码变的更加简洁紧凑

2. Lambda表达式语法

lambda 表达式的语法格式如下:

(parameters) -> expression
或
(parameters) ->{ statements; }

Lambda 表达式的简单例子:

// 1. 不需要参数,返回值为 5  
() -> 5  
  
// 2. 接收一个参数(数字类型),返回其2倍的值  
x -> 2 * x  
  
// 3. 接受2个参数(数字),并返回他们的差值  
(x, y) -> x – y  
  
// 4. 接收2个int型整数,返回他们的和  
(int x, int y) -> x + y  
  
// 5. 接受一个 string 对象,并在控制台打印,不返回任何值(看起来像是返回void)  
(String s) -> System.out.print(s)

// 6. 接收一个参数,使用大括号执行多行代码,不返回任何值  
(int a) -> {
      a = a * a;
      System.out.print(a);
}

3. 方法引用和构造器引用

3.1 还是先上代码:
1.构造器引用
nums.forEach(BigDecimal::new);
等同于nums.forEach(num->new BigDecimal(num);

2.方法引用
nums.forEach(Math::abs);
等同于nums.forEach(num->Math.abs(num));

strings.forEach(String::toString);
等同于strings.forEach(s->s.toString());

以下属于特殊情况
strings.forEach(this::sayhello);
等同于strings.forEach(s->this.sayhello());
3.2 方法引用中使用this

在3.1中有一种写法strings.forEach(this::sayhello);
首先要明确这里的this不是forEach传入的函数对象,而是声明它的外部对象。

public class LambdaTester {

    public void main(String[] args){
        List<String> strings = Arrays.asList("a","b","c","d");
        strings.forEach(this::sayhello);
    }
    
    public void sayhello(String s){
        System.out.println(s + ">>hello");
    }
}

4. 一些注意事项

4.1 lambda 表达式的局部变量可以不用声明为 final,但是必须不可被后面的代码修改
List<Integer> nums = Arrays.asList(3,5,4,6);
        int n = 6;
        nums.forEach(num->{
       		 //n = n + 2;加了这一行代码会报错
             System.out.println(num+n));
        }
4.2 在 Lambda 表达式当中不允许声明一个与局部变量同名的参数或者局部变量。
String a = "a";
Collections.sort(nums, (a,b) -> b.compareTo(b));  //编译会出错 

猜你喜欢

转载自blog.csdn.net/owner_zhou/article/details/87537535
今日推荐