美文网首页
jdk8特性

jdk8特性

作者: 小王ovo | 来源:发表于2019-11-27 17:15 被阅读0次

    最近写java就把jdk8的特性复习了复习做个总结,想想9的模块化10的zgc还有后面新版本的http客户端之类的东西,还是觉得果然go才是世界上最好的语言啊.我讨厌java.

    java8

    lambda表达式

    lambda表达式主要用来定义执行的方法类型接口,例如一个简单方法接口.
    比如说我有一个借口,在以前的话我需要继承接口实现这个接口的实际执行方法.
    现在我只需要在栈上初始化这个接口并在等号后面写上lambda表达式即可因为
    lambda表达式本身就相当于闭包,是函数的实际实现
    这样就不需要我们再去写匿名方法.

    表达式写法
    1.不写参数类型
    编译器可统一识别
    (a,b)->a+b
    2.写参数类型
    (int a,int b)->a+b
    3.接受两个参数需要加(),单参数不需要
    4.如果计算过程只有一个语句就不需要{}
    5.如果使用了{}就必须写return

    lambda表达式不可修改局部变量
    而且lambda表达是的参数是不允许和局部变量同名的.

    方法引用

    类::方法
    对象::方法

    函数式接口

    @FunctionalInterface
    interface GreetingService
    {
    void sayMessage(String message);
    }
    public class funcIMP {
    public static void main(String[] args) {
    GreetingService greetingService=message -> System.out.println(message);
    greetingService.sayMessage("shabi");
    }
    }

    默认方法

    就是说接口可以有实现方法,而且不需要实现类去实现其方法
    但是有时候一个类实现了多个接口,这些接口具有相同的默认方法
    解决方案有两种
    1.创建自己的默认方法来覆盖重写
    2.用super来调用指定接口的默认方法

    Stream

    对集合的聚合处理
    List<String> strings= Arrays.asList("aaefwefwefewfwefwefwef","","aaaaa","dfdsfs","sdsdsdsdsd");
    List<String> filtered=strings.stream().filter(string->!string.isEmpty()).collect(Collectors.toList());
    比如说这两行代码
    第二行就是一个标准的stream
    filter就是一个stream函数,他的参数是一个lambda,他过滤出不为空的元素.collect将过滤出的元素归类到一个新的list里面.

    forEach

    Stream 提供了新的方法 'forEach' 来迭代流中的每个数据。以下代码片段使用 forEach 输出了10个随机数:

    Random random = new Random();
    random.ints().limit(10).forEach(System.out::println);

    map

    map 方法用于映射每个元素到对应的结果,以下代码片段使用 map 输出了元素对应的平方数:

    List<Integer> numbers = Arrays.asList(3, 2, 2, 3, 7, 3, 5);
    // 获取对应的平方数
    List<Integer> squaresList = numbers.stream().map( i -> i*i).distinct().collect(Collectors.toList());

    limit 方法用于获取指定数量的流。 以下代码片段使用 limit 方法打印出 10 条数据:

    Random random = new Random();
    random.ints().limit(10).forEach(System.out::println);

    sorted

    sorted 方法用于对流进行排序。以下代码片段使用 sorted 方法对输出的 10 个随机数进行排序:

    Random random = new Random();
    random.ints().limit(10).sorted().forEach(System.out::println);

    parallel

    parallelStream 是流并行处理程序的代替方法。以下实例我们使用 parallelStream 来输出空字符串的数量:

    List<String> strings = Arrays.asList("abc", "", "bc", "efg", "abcd","", "jkl");
    // 获取空字符串的数量
    int count = strings.parallelStream().filter(string -> string.isEmpty()).count();

    Collectors

    Collectors 类实现了很多归约操作,例如将流转换成集合和聚合元素。Collectors 可用于返回列表或字符串:

    List<String>strings = Arrays.asList("abc", "", "bc", "efg", "abcd","", "jkl");
    List<String> filtered = strings.stream().filter(string -> !string.isEmpty()).collect(Collectors.toList());

    System.out.println("筛选列表: " + filtered);
    String mergedString = strings.stream().filter(string -> !string.isEmpty()).collect(Collectors.joining(", "));
    System.out.println("合并字符串: " + mergedString);

    统计

    另外,一些产生统计结果的收集器也非常有用。它们主要用于int、double、long等基本类型上,它们可以用来产生类似如下的统计结果。

    List<Integer> numbers = Arrays.asList(3, 2, 2, 3, 7, 3, 5);

    IntSummaryStatistics stats = numbers.stream().mapToInt((x) -> x).summaryStatistics();

    System.out.println("列表中最大的数 : " + stats.getMax());
    System.out.println("列表中最小的数 : " + stats.getMin());
    System.out.println("所有数之和 : " + stats.getSum());
    System.out.println("平均数 : " + stats.getAverage());

    还有两样没写一个是Optional 类一个是新的时间api.有时间再说吧.

    相关文章

      网友评论

          本文标题:jdk8特性

          本文链接:https://www.haomeiwen.com/subject/shxmwctx.html