当前位置:   article > 正文

jdk8新特性——Lambda表达式、Stream流、方法引用_e -> e.contains lamba

e -> e.contains lamba

目录

Lambda表达式

1、概念

2、使用规则

3、代码示例

Stream流

1、概念

2、使用

3、代码示例

方法引用

1、概念

2、适用情况

3、代码示例

总结


Lambda表达式

1、概念

        Lambda表达式为一种函数式编程方式,是jdk8中引入的新特性之一,是针对函数式接口的匿名内部类的实现。它提供了一种更简洁、直观的方式来实现函数式编程,使得代码更加易读和易写。这里的易读大家可能不是很赞同,其实当你用习惯了后,确实会觉得这种方式很爽,简单粗暴,一开始用起来可能不是很适应。下面的例子可以带大家感受一下为啥说简单粗暴!需要注意的是,Lambda只针对函数式接口的匿名内部类!

        函数式接口:是指有且仅有一个抽象方法的接口,被@FunctionalInterface注解标记的接口也是函数式接口。

2、使用规则

  • 只有一个参数时可以省略参数类型和();
  • 两个或两个以上参数的参数类型可以省略;
  • 如果方法体中只有一行代码的 { } 可以省略,同时分号和return也不能出现;

3、代码示例

这里我个人觉得看代码比较直观,就直接上代码了。

  1. @Test
  2. public void test1(){
  3. Map<String, Integer> map = new HashMap<>();
  4. map.put("ahaaa",11);
  5. map.put("cpx",23);
  6. map.put("lch",4245);
  7. map.put("chamu",35);
  8. Set<Map.Entry<String, Integer>> entries = map.entrySet();
  9. // 原本 (这里的stream()等都是Stream流的应用,大家可以先忽略,关注排序sorted()方法里面的变化即可
  10. // entries.stream().sorted(new Comparator<Map.Entry<String, Integer>>() {
  11. // @Override
  12. // public int compare(Map.Entry<String, Integer> o1, Map.Entry<String, Integer> o2) {
  13. // return o2.getValue() - o1.getValue();
  14. // }
  15. // }).forEach(e -> System.out.println(e.getKey()+"----"+e.getValue()));
  16. // lambda改写后(省略了o1,o2的参数类型、省略了{ }、省略了return和 ; 号)
  17. entries.stream().sorted((o1, o2) -> o1.getValue() - o2.getValue())
  18. .forEach(e -> System.out.println(e.getKey()+"----"+e.getValue()));
  19. }

Stream流

1、概念

        Stream流也是jdk8中引入的新特性之一,它主要用于处理集合数据,把集合转化成流来操作,把复杂的集合操作以简洁的方式表达出来,具有更高的可读性和可维护性。主要用来结合Lambda表达式语法编程。

2、使用

首先是获取集合的Stream流,然后再进行过滤、排序、去重等等操作。其中数组获取流的方式与集合不同,具体看下列代码演示。

  • 过滤为filter( )方法
  • 排序为sorted( )方法
  • 去重为distinct( )方法
  • 取前几为limit( )方法

注:以上为一些常用的方法,还有其他方法具体可以查看相关api。

3、代码示例

数组

  1. @Test
  2. public void test3(){
  3. // 数组转stream流
  4. String[] names = {"ahaaaa","cpx","lch","chamu"};
  5. // 获取流方式1
  6. // Stream<String> namesStream = Stream.of(names);
  7. // 获取流方式2
  8. Stream<String> stream = Arrays.stream(names).;
  9. // 调用filter()进行过滤,判断集合中的对象e是否包涵“p”,若不包含过滤,然后调用forEach()进行遍历
  10. stream.filter(e -> e.contains("p")).forEach(e -> System.out.println(e));
  11. }

集合

  1. @Test
  2. public void test1(){
  3. // list转stream流
  4. List<String> list = new ArrayList<>();
  5. list.add("ahaaaa");
  6. list.add("banana");
  7. list.add("apple");
  8. list.add("grapes");
  9. list.add("watermelon");
  10. // 调用filter()进行过滤,判断集合中的对象e是否包涵“b”,若不包含过滤,然后调用forEach()进行遍历
  11. list.stream().filter(e -> e.contains("b")).forEach(e -> System.out.println(e));
  12. // 调用count()获取集合格个数
  13. System.out.println(list.stream().count());
  14. }

方法引用

1、概念

        方法引用是用于简化Lambda表达式的定义,它可以直接引用已有代码中的方法,作为Lambda表达式的替代形式,从而让代码更简洁、更易读。

2、适用情况

  • Lambda表达式中只调用了一个静态方法,并且前后参数一致;
  • Lambda表达式中只调用了一个实例方法,并且前后参数一致;
  • Lambda表达式中只调用了一个实例方法,入参为两个参数,并且第一个参数作为调用方调用第二个参数;

这里结合下面三个代码示例理解比较简单

3、代码示例

第一种适用情况

  1. @Test
  2. public void test1(){
  3. List<Cat> objects = new ArrayList<>();
  4. Cat hei = new Cat("小黑", 11);
  5. Cat bai = new Cat("小白", 23);
  6. Cat lan = new Cat("小蓝", 45);
  7. Cat hong = new Cat("小红", 64);
  8. objects.add(hei);
  9. objects.add(bai);
  10. objects.add(lan);
  11. objects.add(hong);
  12. // 原本 第一步
  13. // objects.stream().sorted(new Comparator<Cat>() {
  14. // @Override
  15. // public int compare(Cat o1, Cat o2) {
  16. // return o1.getAge()-o2.getAge();
  17. // }
  18. // }).forEach(e -> System.out.println(e.toString()));
  19. // 改写成lambda 第二步
  20. // objects.stream().sorted((o1, o2) -> o1.getAge()-o2.getAge())
  21. // .forEach(e -> System.out.println(e.toString()));
  22. // 改写成写好排序的CopareByAgeAsc()静态方法 第三步
  23. // objects.stream().sorted((o1, o2) -> CompareByAge.CopareByAgeAsc(o1, o2))
  24. // .forEach(e -> System.out.println(e.toString()));
  25. // 改写成静态方法引用 第四步
  26. // objects.stream().sorted(CompareByAge::CopareByAgeAsc)
  27. // .forEach(e -> System.out.println(e.toString()));
  28. }

第二种适用情况

  1. @Test
  2. public void test1(){
  3. List<Cat> objects = new ArrayList<>();
  4. Cat hei = new Cat("小黑", 11);
  5. Cat bai = new Cat("小白", 23);
  6. Cat lan = new Cat("小蓝", 45);
  7. Cat hong = new Cat("小红", 64);
  8. objects.add(hei);
  9. objects.add(bai);
  10. objects.add(lan);
  11. objects.add(hong);
  12. // 原本
  13. // objects.stream().sorted(new Comparator<Cat>() {
  14. // @Override
  15. // public int compare(Cat o1, Cat o2) {
  16. // return o1.getAge()-o2.getAge();
  17. // }
  18. // }).forEach(e -> System.out.println(e.toString()));
  19. // 改写成lambda
  20. // objects.stream().sorted((o1, o2) -> o1.getAge()-o2.getAge())
  21. // .forEach(e -> System.out.println(e.toString()));
  22. // 改写成调用实例方法引用
  23. CompareByAge compareByAge = new CompareByAge();
  24. // objects.stream().sorted((o1, o2) -> compareByAge.CopareByAgeDesc(o1, o2))
  25. // .forEach(e -> System.out.println(e.toString()));
  26. // 改写成实例方法引用
  27. objects.stream().sorted(compareByAge::CopareByAgeDesc)
  28. .forEach(e -> System.out.println(e.toString()));
  29. }

第三种适用情况

  1. @Test
  2. public void test2(){
  3. String[] strings = new String[]{"banana","ahaaaa","fix","available"};
  4. // 原本
  5. // Arrays.sort(strings, new Comparator<String>() {
  6. // @Override
  7. // public int compare(String o1, String o2) {
  8. // return o1.compareTo(o2);
  9. // }
  10. // });
  11. // 改写成lambda
  12. // Arrays.sort(strings, (o1, o2) -> o1.compareTo(o2));
  13. // 改写成特定类型方法引用
  14. Arrays.sort(strings, String::compareTo);
  15. for (String string : strings) {
  16. System.out.println(string);
  17. }
  18. }

总结

        总的来说,Lambda表达式、Stream流和方法引用这些新特性都致力于简化代码,提高代码的可读性和可维护性。它们让我们能够以更加直观的方式处理和操作数据,减少了冗余的代码和中间变量的使用,使得代码更简洁、更易理解和调试。同时,它们还提供了更高效的数据处理方式,能够更好地应对大数据量和并行处理的场景。只有熟练使用后,就会非常顺手,也会觉得非常的香。举个我遇到的场景,要for遍历一个集合,然后又要根据集合中的字段做排序,去重等等操作,需要10+行的代码,使用这些新特性后,一行代码就搞定了,而且可读性也非常的高,一眼就能看出过滤的条件,去重等逻辑代码。

上述示例代码我都放在了gitee中,需要的伙伴可以自己拿。

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

闽ICP备14008679号