当前位置:   article > 正文

Java8新特性--lambda表达式

Java8新特性--lambda表达式

lambda表达式本质上是一个匿名函数,在lambda表达式中我们只需要关心参数列表以及方法体。优点是可以减少代码量。

1.语法

基本语法:(参数)->表达式 或 (参数) -> {语句;}

2.函数式接口

要了解lambda表达式,首先要了解什么是函数式接口,其定义是:一个接口有且只有一个抽象方法。

如下代码

  1. @FunctionalInterface //用于声明该接口是一个函数式接口,即该接口中有且只有一个抽象方法
  2. public interface Mytest {
  3. void test(int a,int b);
  4. }

使用该接口,可以看出使用lambda表达式代码量会减少许多。

  1. // 普通写法
  2. Mytest mytest = new Mytest() {
  3. @Override
  4. public void test(int a, int b) {
  5. System.out.println(a+b);
  6. }
  7. };
  8. mytest.test(1,2);
  9. // 使用lambda表达式
  10. Mytest mytest1 = (a,b) -> System.out.println(a+b);
  11. mytest1.test(1,2);

使用lambda的几个新写法:

1.List列表打印

  1. List<String> list = Arrays.asList("aaa","bbb","ccc");
  2. // 普通写法
  3. for (String str: list) {
  4. System.out.println(str);
  5. }
  6. // 使用lambda表达式
  7. list.forEach(str -> System.out.println(str)); //只需要关心参数列表和方法体
  8. // 方法体只有一行语句可以省略大括号
  9. list.forEach(str -> {
  10. System.out.println(str);
  11. });

2.排序

  1. List<String> list = Arrays.asList("aaa","aa","cde","a");
  2. // 普通写法
  3. Collections.sort(list, new Comparator<String>() {
  4. @Override
  5. public int compare(String o1, String o2) {
  6. return o1.compareTo(o2);
  7. }
  8. });
  9. // 打印
  10. list.forEach(s -> System.out.println(s));
  11. // 使用lambda表达式
  12. Collections.sort(list,(o1,o2) -> o1.compareTo(o2)); //只需要关心参数列表和方法体
  13. // 打印
  14. list.forEach(s -> System.out.println(s));

3.过滤

  1. List<String> list = Arrays.asList("aaa","aa","cde","a");
  2. // 普通写法
  3. List<String> list1 = new ArrayList<>();
  4. for (String str: list) {
  5. if(str.startsWith("a")) {
  6. list1.add(str);
  7. }
  8. }
  9. // 打印
  10. list1.forEach(s -> System.out.println(s));
  11. // lambda新写法 使用stream流
  12. list.stream().filter(s -> s.startsWith("a")).collect(Collectors.toList());
  13. // 打印
  14. list.forEach(s -> System.out.println(s));

4.求和操作

  1. List<Integer> list = Arrays.asList(1,2,3,4,5);
  2. // 普通写法
  3. int num = 0;
  4. for (int i: list) {
  5. num += i;
  6. }
  7. System.out.println(num);
  8. // 使用lambda表达式
  9. Integer ret = list.stream().reduce(0, (a, b) -> a + b);
  10. System.out.println(ret);

5.计算每个字符串的长度

  1. List<String> list = Arrays.asList("aaa","aa","cde","a");
  2. //普通写法
  3. List<Integer> num = new ArrayList<>();
  4. for (String str: list) {
  5. num.add(str.length());
  6. }
  7. num.forEach( n -> System.out.println(n));
  8. // 使用lambda表达式
  9. List<Integer> num1 = list.stream().map(n -> n.length()).collect(Collectors.toList());
  10. num1.forEach(n -> System.out.println(n));

6.根据字符串长度进行分组

  1. List<String> list = Arrays.asList("aaa","aa","cde","a");
  2. //普通写法
  3. Map<Integer,List<String>> map = new HashMap<>();
  4. for (String str : list) {
  5. if(!map.containsKey(str.length())) {
  6. map.put(str.length(),new ArrayList<>());
  7. }
  8. map.get(str.length()).add(str);
  9. }
  10. System.out.println(map);
  11. // 使用lambda表达式
  12. Map<Integer, List<String>> map1 = list.stream().collect(Collectors.groupingBy(s -> s.length()));
  13. System.out.println(map1);

7.创建新线程

  1. // 普通写法
  2. Thread thread = new Thread(new Runnable() {
  3. @Override
  4. public void run() {
  5. System.out.println("abc");
  6. }
  7. });
  8. thread.start();
  9. // 使用lambda表达式
  10. Thread thread1 = new Thread(() -> System.out.println("abc"));
  11. thread1.start();

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小蓝xlanll/article/detail/392314
推荐阅读
相关标签
  

闽ICP备14008679号