zoukankan      html  css  js  c++  java
  • java8新特性

    介绍流程:

    Lambda表达式

    Stream

    Optional

    附上思维导图:

     

    1.Lambda表达式

     (1)特点:通过表达式来实现相关接口方法,简化使用匿名类的操作,提高代码整洁性。

     (2):常见的几种使用方式:

     1 public class TestLambda {
     2     //常见形式
     3     private Math add = (a, b) -> a + b;
     4     private Math remove = (int a, int b) -> a - b;
     5     private Math decade = (a, b) -> a * b;
     6     private Math square = (int a, int b) -> a / b;
     7     private Message msg = (a) -> System.out.println("测试" + a);
     8     private Map map = new HashMap();
     9 
    10     @Test
    11     //测试
    12     public void test() {
    13         Integer[] i = new Integer[]{1, 2, 3, 4};
    14         map.put(1, "x");
    15         map.put(2, "y");
    16         //通过表达式实现接口方法 ->有返回值
    17         System.out.println(add.caculate(1, 2));
    18         System.out.println(remove.caculate(1, 2));
    19         System.out.println(decade.caculate(1, 2));
    20         System.out.println(square.caculate(1, 2));
    21         //无返回值
    22         msg.play(1);
    23         //集合的遍历 ->遍历所有值
    24         map.forEach((c, v) -> System.out.println(v));
    25         //集合的遍历 ->遍历所有键
    26         map.forEach((c, v) -> System.out.println(c));
    27         Arrays.asList(i).sort((a, b) -> {
    28             if (a > b) {
    29                 return a;
    30             }
    31             return b;
    32         });
    33     }
    34 }
    35 
    36 //声明为函数式接口:仅包含一个方法,且方法符合Lambda表达式使用规范
    37 @FunctionalInterface
    38 interface Math {
    39     int caculate(int a, int b);
    40 }
    41 
    42 @FunctionalInterface
    43 interface Message {
    44     void play(int a);
    45 }

    效果截图:

    (3)Lambda表达式的优缺点:

    优点:使用lambda表达式代替匿名类使用,接口方法实现,提高了代码的整洁性。

    缺点:维护较难,对开发人员的要求也比较高。

    2.Stream

    (1)特点:能够对集合对象进行包装,对集合元素进行相关操作,如遍历,过滤,去重等等。

    (2)常用方法:

     1 public class TestStream {
     2     private List<String> list = new ArrayList<>();
     3 
     4     @Test
     5     public void test() {
     6         list.add(0, "123");
     7         list.add(1, "456");
     8         list.add(2, "789");
     9         list.add(3, "456");
    10         //运用流Stream进行过滤,将内容不是123字符串的内容过滤出来并获得个数
    11         System.out.println(list.stream().filter(e -> !e.equals("123")).count());
    12         //集合遍历forEach
    13         list.stream().forEach(e -> System.out.println(e));
    14         //将过滤出来的元素再放入一个集合列表中
    15         List l2 = (List) list.stream().filter(e -> !e.equals("123")).collect(Collectors.toList());
    16         //操作集合元素去重后拼接成字符串
    17         String str = (String) list.stream().distinct().collect(Collectors.joining("-"));
    18         System.out.println(str);
    19         //遍历
    20         l2.stream().forEach(e -> System.out.println(e));
    21         //通过流stream获取新集合的首个Optional元素
    22         System.out.println("首元素:" + l2.stream().findFirst());
    23         //通过流Stream去重后元素个数
    24         System.out.println("去重后个数为:" + l2.stream().distinct().count());
    25         //lambda表达式的内部可以引用外部变量或局部变量,
    26         // 但是不允许在表达式中对该变量进行修改,该变量只能被声明为final
    27         int factor = 1;
    28         //若修改该变量直接编译错误
    29         /*  list.stream().forEach(e-> System.out.println(factor++));*/
    30         //使用reduce可以操作集合内元素然后返回一个新值,
    31         //可实现自定义值结果获取
    32         System.out.println(list.stream().reduce((e, e2) -> {
    33             return (Integer.parseInt(e) > Integer.parseInt(e2) ? e : e2);
    34         }));
    35     }
    36 }

    数组->流过滤->数组:

    集合元素移除不需要的值:

     对集合进行判断 是否 符合某条件:

    字符串去重:

    效果截图:

     常用方法图解:

    3.Optional

    (1)特点:对于那些空对象的存在,在程序运行时报空指针异常使程序无法继续执行的情况下,可以对这类情况进行避免,使用Option类对这类空指针对象进行获取,判断,设默认值等。

    (2)常用方法:

     1 public class TestOptional {
     2     private String str = "abc";
     3 
     4     @Test
     5     public void test() {
     6         //判断str对象是否为空
     7         Optional<String> optional = Optional.ofNullable(str);
     8         //如果为空或者null则返回Optional.empty,不为空返回Optional对象
     9         System.out.println(optional);
    10         //若对象为空则报空指针异常->如果不确定为空尽量使用ofNullable()方法判断对象是否为空
    11         System.out.println(Optional.of(str).get());
    12         //获取与字符串内容为123不相同的字符串值
    13         System.out.println("过滤"+optional.filter(e -> !e.equals("123")).get());
    14         //判断当前的对象会否存在且不为空
    15         System.out.println("当前对象不为空?"+optional.isPresent());
    16         //对数据元素进行一定的修改,返回修改后的元素
    17         System.out.println("map方法修改后:"+optional.map(e-> e+"x").get());
    18         //如果获取的对象为空,那么就返回传入的参数值,如果不为空则返回原有值
    19         str=null;
    20         Optional<String> optional2 = Optional.ofNullable(str);
    21         System.out.println(optional2.orElse("456"));
    22     }
    23 }

    效果截图:

    文章待完善。。。

  • 相关阅读:
    SQL序列键
    SQL日期跟时间值序列
    springboot日志配置
    weblogic10补丁升级与卸载
    idea使用svn报错
    mybatis插入数据并返回主键(oracle)
    UTF-8格式txt文件读取字节前三位问题
    https连接器
    git将本地项目上传码云
    aop的使用
  • 原文地址:https://www.cnblogs.com/weekstart/p/java8.html
Copyright © 2011-2022 走看看